JavaScript|JavaScript — 对象的数据属性和访问器属性
- 数据属性
- [[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;
}}
});
【JavaScript|JavaScript — 对象的数据属性和访问器属性】
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"
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议
- 事件代理