ECMAScript中的对象

什么是对象

ECMAScript中没有其它面向对象语言中类的概念,所以对象的概念也有所不同。在ECMAScript中,对象可以理解为一组没有特定顺序的键值对,每个对象都是基于一个引用类型创建的,可以是原生的引用类型,也可以是开发者自定义的类型。最简单的创建对象的方式就是创建Object构造函数的实例,再往其中添加属性和方法。

属性的类型和它们的特性

ECMAScript中对象的属性分为两种: 数据属性和访问器属性;数据属性是一个包含数据值的位置,访问器属性则包含一对setter和getter,直接定义在对象上的属性默认为数据属性。为了实现JavaScript引擎,ECMAScript定义了一些特性,用来描述不同属性的特征,在JavaScript中无法直接访问它们。

  • 共用的特性:
    • [[Configurable]]:描述了属性的三个特征:一是这个属性能否使用delete删除属性,从而重新定义属性;二是属性的特性能否被修改,所以,一旦设置了这个属性为false,再去修改包括configurable本身的特性都会报错,writable特性只能从true设置为false,但不能从false设置为true;三是代表了数据属性和访问器属性能否相互转换。对于直接定义在对象上的属性,它默认为true。
    • [[Enumerable]]:描述了属性是否可枚举,也就是能否被for in遍历到。对于直接定义在对象上的属性,它默认为true。
  • 数据属性的专有特性:
    • [[Writable]]:描述了是否可以使用"object.property=value"这样的方式修改属性值。对于直接定义在对象上的属性,它默认为true。
    • [[Value]]:包含属性数据值的位置,读写都通过这个位置进行。任何情况它的默认值都为undefined。
  • 访问器属性的专有特性:
    • [[Get]]:是一个函数,读取属性时会调用它。任何情况它的默认值都为undefined。
    • [[Set]]:是一个函数,写入属性时会调用它。任何情况它的默认值都为undefined。

修改属性的特性

  • Object.defineProperty()、Object.defineProperties():

要修改一个属性的默认特性,只能通过ECMAScript5中的Object.defineProperty()、Object.defineProperties()方法,后者能同时修改多个属性;它们接收三个参数:属性所在的对象、属性名、描述符对象,描述符对象就一个或多个特性的集合;使用这两个方法定义一个新属性的时候,[[Configurable]]、[[Enumerable]]、[[Writable]]特性的默认值均为false 。Object.defineProperty()方法最早竟然是由ie8实现的,但是实现不彻底,只能创建DOM对象的访问器属性。

  • 其他方法:

在比较老的Firefox、Safari3、Chorme1和Opera9.5以上的浏览器中,可以使用definGetter()和defineSetter()来创建访问器属性,但这两个方法已经从web标准中删除了,说不定什么时候某个浏览器就不支持了。

不支持Object.defineProperty()的浏览器无法修改[[Configurable]]、[[Enumerable]]特性。

读取属性的特性

在支持Object.defineProperty()方法的浏览器中,可以使用Object.getOwnPropertyDescriptor()方法获取给定属性的描述符对象,接收两个参数:属性所在的对象和属性名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章