js中的访问器属性

js访问器属性

访问器属性不包含数据值;它们包含一对儿getter和setter函数。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。

访问器属性有如下4个特性:

[[Configurable]]、[[Enumerable]]、[[Get]]、[[Set]]

1.使用访问器属性的常见方式(设置一个属性的值导致其他属性发生变化。)

var book={
    _year:2004,//_year是通过对象方法访问的属性。
    edition:1
};
Object.defineProperty(book,"year",{//year是一个访问器属性,包含一个getter函数和setter函数。
    get: function(){//读取属性时调用的函数
        return this._year;
    },
    set: function(newValue){//在写入属性时调用的函数
        if(newValue>2004){
            this._year=newValue;
            this.edition+=newValue-2004;
        }
    }
});
book.year=2005;//把year属性修改为2005会导致_year变成2005,而edition变成2
console.log(book.edition);//2

2.不一定非要同时指定getter和setter.但只指定getter意味着属性是不能写,尝试写入属性会被忽略,类似的,只指定setter函数的属性也不能读。

var book={
    _year:2004,
    edition:1
};
Object.defineProperty(book,"year",{
    get: function(){
        return this._year;
    }
});
book.year=2005;
console.log(book.year);//2004

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;
console.log(book.year);//undefined

3.定义访问器的旧有方法:__defineGetter__()和__defineGetter__().

var book={
    _year:2004,
    edition:1
};
book.__defineGetter__("year",function(){
    return this._year;
});
book.__defineGetter__("year",function(newValue){
    if(newValue>2004){
        this._year=newValue;
        this.edition+=newValue-2004;
    }
});
book.year=2005;
console.log(book.year);//2005

4.在不支持Object.defineProperty()方法的浏览器中不能修改[[Configurable]]和[[Enumerable]]。

猜你喜欢

转载自blog.csdn.net/yangyuqingabc/article/details/82873290