属性类型

    ECMAScript 中有两种属性类型:数据属性和访问器属性。
    一、数据属性
    数据属性包含一个数据值的位置,在这个位置可以读取和写入值。它有 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

猜你喜欢

转载自aisxyz.iteye.com/blog/2405633