要修改属性默认的特性,必须使用ECAMScript 5的 Object.defineProperty() 方法。
例如:
var person = {}; Object.defineProperty( person,'name',{ writable:false, value:'tom' } ); console.log(person.name);//tom person.name = 'join'; console.log(person.name);//tom
这个例子创建了一个名为name的属性,他的值为tom是只读的。这个属性的值是不可以修改的,如果尝试为他指定新值,在非严格模式下,赋值操作将被忽略,在严格模式下,赋值操作将会导致抛出错误。
类似的规则也适用于不可配置的属性。例如:
var person = {}; Object.defineRroperty(person,'name',{ configurable:false, value:'tom' }); console.log(perso.name);//tom delete person.name;//false console.log(person.name);//tom
可以多次调用Object.defineProperty()方法修改同一个属性,但是把configurable特性设置为false之后就会有限制
调用这个方法的时候,如果不指定,configurable、enumerable 和writable特性的默认值都是false
访问器属性
访问器属性不包含数据值
他们包含一对getter和setter函数(不过,这两个函数都不是必须的)
在读取访问器属性的时候,会调用getter函数,这个函数复制返回有效的值。
在写入访问器属性的时候,会调用setter函数,并传入新值,这个函数负责决定如何处理数据。
访问器属性有如下四个特性
configurable
表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。
直接在对象时定义的属性,这个特性的默认值为true
enumerable
保湿能否通过for-in循环返回属性。
直接在对象上定义的属性,这个特性的默认值为true
get
在读取属性时调用的函数
默认值为undefined
set
在写入属性时调用的函数
默认值为undefined
访问器属性不能直接定义。必须使用 Object.defineProperty()来定义。
例子:
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