- 数据属性
- [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true;若把configurable 设置为false,则表示不能从对象中删除属性,且不能再变回可配置的了,此时再调用Object.defineProperty() 修改除writable之外的特性都会导致错误
- [[Enumerable]]:表示能否通过 for-in 循环返回属性
- [[Writable]]:表示能否修改属性的值
- [[Value]]:包含这个属性的数据值
Object.defineProperty
(属性所在的对象,属性的名字,一个描述符对象)`用来修改属性默认的特性
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
console.log(person.name); //"Nicholas"
person.name = "Greg";
console.log(person.name); //"Nicholas"
- 访问器属性
- [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true
- [[Enumerable]]:表示能否通过 for-in 循环返回属性
- [[Get]]:在读取属性时调用的函数,默认值为 undefined
- [[Set]]:在写入属性时调用的函数,默认值为 undefined
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.edition); //2
Object.defineProperties()
定义多个属性
var book = {};
Object.defineProperties(book,
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
Object.getOwnPropertyDescriptor()
读取属性的特性
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
console.log(descriptor.value); //2004
console.log(descriptor.configurable); //false
console.log(typeof descriptor.get); //"undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
console.log(descriptor.value); //"undefined"
console.log(descriptor.enumerable); //false
console.log(typeof descriptor.get); //"function"
网友评论