1、数据属性
- [[Configurable]]:能否通过delete删除属性从而重新定义属性。默认为true.
- [[Enumerable]]能否通过for-in循环删除属性。默认为true.
- [[Writable]]能否修改属性。默认为true.
- [[Value]]:包含属性的数据值。默认为undefined。
Object.defineProperty()对一个对象的一个方法只能调用一次,否则报cannot redfine property :xxx;
var person = {} Object.defineProperty(person, "name", { writable : false, configurable : false, value:"zhangsan" }); person.name = "lisi"; Object.defineProperty(person, "name", { writable : true }); document.write("pserson.name: " + person.name);2、访问器属性
- [[Configurable]]:能否通过delete删除属性从而重新定义属性。默认为true.
- [[Enumerable]]能否通过for-in循环删除属性。默认为true.
- [[Get]]在读取属性时调用的函数。默认为undefined.
- [[Set]]:在写入属性时调用的函数。默认为undefined。
var book = {_year:2003,edition:5}; Object.defineProperty(book,"year",{ get:function(){ return this._year; }, set:function(newValue){ this._year = newValue; this.edition +=newValue-2003; } }); book.year = 2014; document.write("book.edition: " + book.edition);3、读取属性的特性使用Object.getOwnPropertyDescriptor方法。eg.
var book = { _year : 2003, edition : 5 }; Object.defineProperties(book, { _year : { writable : false, configurable : false }, year : { get : function() { return this._year; }, set : function(newValue) { this._year = newValue; this.edition += newValue - 2003; } } }); book.year = 2014; var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); console.log("descriptor: ",descriptor); document.write("book.edition: " + book.edition);