官方支持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);