数据属性

数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个特性:

  1. Configurable 能否通过delete删除属性而重新定义,能否修改为访问器属性。默认true。

  2. Enumerable 能否通过for-in 循环返回属性。默认true。

  3. Writable 能否修改属性的值。默认true。

  4. Value 包含这和属性的数据值。读取值得时候,从这个位置读,写的时候保存新值在这个位置。默认undefined。
    要修改属性默认的特征,需要使用Object.defineProperty()方法。

var person = {};
Object.defineProperty(person, 'name', {
    writable : false,
    configurable : false,
    value : 'jeck'
});
console.log(person.name);    //jeck
person.name = 'andy';
console.log(person.name);    //jeck

访问器属性

访问器属性不包含数据值,包含一对getter和setter函数,读取访问器属性时,调用getter函数,写入时,调用setter函数,其也包含4个特征:

  1. Configurable 能否通过delete删除属性而重新定义,能否修改为数据属性。默认true。

  2. Enumerable 能否通过for-in 循环返回属性。默认true。

  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
        }
    }
});

使用访问器属性常见的方法即设置一个属性的值会导致其他属性发生变化。

定义多个属性

通过Object.defineProperties()方法可以一次定义多个属性,第一个参数为要添加和修改的对象,第二个为要添加或修改的属性。
var book = {};
Object.defineProperties(book, {
    _year : {
        value : 2004
    },
    num : {
        value : 1
    },
    year : {
        get : function(){
               return this._year; 
        },
        set : function(newValue){
            if (newValue > 2004){
                this._year = newValue;
            }
        }
    }
})

在上面的book对象上面同一时间定义了2个数据属性和一个访问器属性。


93回忆录
103 声望1 粉丝

下一篇 »
原型模式