JavaScript中的对象属性有两种:
一,数据属性
数据属性有四个描述其行为的特性:
1:Configurable
定义了能否删除属性,能否修改属性的特性,能否把属性修改为访问器属性,该属性默认值是true。
2,Enumerable
定义了能否通过for...in遍历对象属性,该属性默认值时true。
3,Writable
定义了能否修改对象的属性
4,Value
定义了属性的数据值,默认为undefined
创建一个对象:
var school={
name:"北大"
};
我们要修改属性默认的特性,必须使用ECMAScript5的Object.defineproperty方法。
操作1:修改configurable为false
Object.defineProperty(school,"name",{
configurable:false
});
执行delete school.name,打开浏览器控制台可以看到,在非严格模式下没有任何反应,在严格模式下会有错误提示。
错误提示:Uncaught TypeError: Cannot delete property 'name' of #<Object>
既然configurable已经被设置为false,就不能在调用defineProperty方法修改回true,否则不管是否严格模式都会报错。
Object.defineProperty(school,"name",{
configurable:true
});
错误提示:Uncaught TypeError: Cannot redefine property: name
但是writable特性例外,除了修改Writable的特性不会报错,修改其它的特性都会报错。
二,访问器属性
访问器属性也有四个描述其行为的特性:
1:Configurable
定义了能否删除属性,能否修改属性的特性,能否把属性修改为数据属性,该属性默认值是true。
2,Enumerable
定义了能否通过for...in遍历对象属性,该属性默认值时true。
3,Set
修改属性值的时候调用该函数
4,Get
读取属性值的时候调用该函数
var book = { _year: 2017, editor: 1 }; Object.defineProperty(book, "year", { get: function() { return this._year; }, set: function(newVal) { if (newVal != this._year) { this._year = newVal; this.editor++; } } });
定义的访问器属性,只能通过对象方法访问。