一、数据属性
数据属性包含一个数据值的位置,在这个位置可以读取和写入值。它有 4 个描述其行为的特性。
(1)configurable:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为 true。
(2)enumerable:表示能否通过 for-in 循环返回属性,默认为 true。
(3)writable:表示能否修改属性的值,默认为 true。
(4)value:包含这个属性的数据值。读取或修改属性时操作的都是这个位置,默认为 undefined。
要修改属性默认的特性,必须使用 Object.defineProperty() 方法。该方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。其中,描述符对象的属性必须是上面这几个特性的一种或多种。注意,一旦调用该方法,configurable、enumerable 和 writable 的默认值就会变为 false。例如:
var person1 = {}; Object.defineProperty(person1, "name", { writable: false, value: "Nicholas" }); alert(person1.name); // "Nicholas" person.name = "Greg"; alert(person1.name); // "Nicholas" var person2 = {}; Object.defineProperty(person2, "name", { configurable: false, value: "Nicholas" }); alert(person2.name); // "Nicholas" delete person2.name; alert(person2.name); // "Nicholas"
其中,person1 对象的 name 属性是只读的,它不能被修改。如果尝试修改它的值,则在非严格模式下会被忽略,而严格模式下会报错(其它特性也一样)。而 person2 对象的 name 属性是不可配置的,这表示不能删除和修改,而且也不能再变为可配置的。
二、访问器属性
访问器属性不包含数据值,它们包含一对 getter 和 setter 函数。在读取访问器属性时会调用 getter,在写入访问器属性时则调用 setter。当只定义 getter 时表示只读。访问器属性有如下 4 个特性。
(1)configurable:同数据属性。
(2)enumerable:同数据属性。
(3)get:在读取属性时调用的函数,默认为 undefined。
(4)set:在写入属性时调用的函数,默认为 undefined。
访问器属性也只能使用 Object.defineProperty() 来定义,它一般用在设置一个属性的值会导致另一个属性的值变化的情况。如下面的例子所示:
var book = { _year: 2004, edition: 1 }; Object.defineProperty(book, "year", { get: function (){ return this._year; }, set: function (newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005; alert(book.edition); // 2