ECMAScript5 允许使用用户定义的属性描述符来覆盖给定属性的下列任何特性。
enumerable :控制属性是否可以在for-in循环中被枚举。
configurable:控制属性是否可以用delete来删除。
writable:控制属性是否可以呗覆盖。
get:一个计算属性访问的返回值函数。
set:一个函数,当属性被赋值时被调用。
ECMAScript5 中引入的方法 Object.defineProperty 可以为一个对象增加新的属性。
var person = {}; Object.defineProperty(person, "name", { writable: false, configurable: false, value: "Nicholas" }); person.name = "Jack"; delete person.name; alert(person.name);
执行以上代码会弹出 ‘Nicholas’,这就证明赋值与删除对person.name属性无效了(使用defineProperty添加属性时 enumerable configurable writable 默认都将被设置为false)。
var person = { _year: 2012 } Object.defineProperty(person, "year", { get: function() { return this._year; }, set: function(value) { this._year = value; } }); alert(person.year); person.year = 2015; alert(person.year);
上面我们为_year添加了getter和setter 名为year ,所以运行代码第一次回弹出 ’2012‘ 第二次弹出 ‘2015’ 。
ECMAScript5 中还有一个方法 Object.defineProperties可以为一个对象增加多个属性。
var book = {}; Object.defineProperties(book, { _year: { writable: true, value: 2004 }, edition: { value: 1 }, year: { get: function() { return this._year; }, set: function(value) { this._year = value; } } });
以上代码为book添加 _year属性与edition属性, 还为_year 添加了getter 和setter。