对象的特性、setter 和 getter
- 除了包含名字和值外,属性还包含一些标识它们可写、可枚举和可配置的特性。在 ES3 中无法设置这些特性,所有通过 ES3 的程序创建的属性都是可写的、可枚举的和可配置的,且无法对这些特性做修改。本节将讲述 ES5 中查询和设置这些属性特性的 API。这些 API 对于库的开发者来说非常重要,因为:
1.可以通过这些 API 给原型对象添加方法,并将它们设置成不可枚举的,这让它们看起来更像内置方法。
2.可以通过这些 API 给对象定义不能修改或删除的属性,借此“锁定”这个对象。 - 我们将存取器属性的 getter 和 setter 方法看成是属性的特性。按照这个逻辑,我们也可以把数据属性的值同样看作属性的特征。因此,可以认为一个属性包含一个名字和 4 个特性。数据属性的 4 个特性分别是它的值(value)、可写性(writable)、可枚举性(enumerable)和可配置性(configurable)。存取器属性不具有值(value)特性和可写性,它们的可写性是由 setter 方法存在与否决定的。因此存取器属性的 4 个特性是读取(get)、写入(set)、可枚举性和可配置性。
- 数据属性的描述符对象的属性有 value、writable、enumerable 和 configurable。存取器属性的描述符对象则用 get 属性和 set 属性代替 value 和 writable。其中 writable、enumerable 和 configurable 都是布尔值,当然,get 属性和 set 属性是函数值。
- 当通过一个对象来调用函数时,该对象就是此次调用的上下文,也就是该函数的 this 值。
- 任何函数只要作为方法调用实际上都会传入一个隐式的实参,这个实参是一个对象。方法调用的母体就是这个对象。通常来讲,基于那个对象的方法可以执行多种操作,方法调用的语法已经很清晰地表明了函数将基于一个对象进行操作。
- 之所以没有用 var 声明的变量可以使用 delete 操作符删除,而使用 var 定义的不可以被删除,是因为使用了 var 以后,该变量作为 window 的属性,它的特性 [[Configurable]] 的值被设置为了 false。