javascript定义getter,setter函数

官方支持defineProperty定义getter,setter函数。

defineProperty可以设置数据属性或者访问器属性,只能选择其中一个。接收三个参数:设置属性的对象,属性名,描述符对象。

数据属性:

configurable:表示能否通过delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。

enumerable:是否可枚举,表示能否通过for-in 循环返回属性。

writable:表示能否修改属性的值。

value:属性的值。

访问器属性:

configurable,enumerable和上面一样,

get:在读取属性时调用的函数,

set:在写入属性时调用的函数。

以下代码通过defineProperty给book添加了year属性。当读取year属性的时候会打印get,给year赋值时会打印set。

结果是:

get

2004

set

2005

get

2005

2

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

与之相似的是__defineGetter__和__defineSetter__,前后都是两个下划线_。这是定义访问器的旧有方法。

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

 

你可能感兴趣的:(JavaScript)