根据《JavaScript高级程序设计(第3版)》中的介绍,139页6.1.1“属性类型”中,对属性特性的描述是这样的:
特性标签 |
默认值 |
说明 |
[[Configurable]] |
true |
能否通过delete删除属性从而重新定义属性、能否修改属性特性、能否把数据属性修改为访问器属性。 |
[[Enumerable]] |
true |
能否通过for-in循环返回属性 |
[[Writable]] |
true |
能否修改属性值 |
[[Value]] |
undefined |
包含这个属性的数据值 |
“要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法。”
下面做一组实践:
alert后的注释内容为弹出窗口的实际内容。
/*不使用Object.defineProperty()方法的情况*/ var person={ name:"Nicholas" }; alert(person.name); //Nicholas person.name="Greg"; alert(person.name); //Greg delete person.name; alert(person.name); //undefined
↑这符合常规逻辑。
/*属性值在Object.defineProperty()方法中定义的情况*/ var person={}; Object.defineProperty(person,"name",{ value:"Nicholas" }); alert(person.name); //Nicholas person.name="Greg"; alert(person.name); //Nicholas delete person.name; alert(person.name); //Nicholas
↑可以看到,在方法中定义属性值后,该属性值不可改且无法被删除。这与书中特性的默认值为true似乎相悖。
/*在Object.defineProperty()中显式定义[[configurable]]、[[writable]]为true后的情况*/ var person={}; Object.defineProperty(person,"name",{ configurable:true, writable:true, value:"Nicholas" }); alert(person.name); //Nicholas person.name="Greg"; alert(person.name); //Greg delete person.name; alert(person.name); //undefined
↑显式定义[[configurable]]、[[writable]]特性为true后,才与第一种情况一样。
以上测试基于火狐浏览器23.0.1和IE11浏览器,alert后的注释内容即为弹出窗口显示结果。
这似乎应该总结如下:在没使用Object.defineProperty()方法时,数据属性的[[configurable]]、[[writable]]等特性默认值为true。而使用了Object.defineProperty()方法设置属性值后,[[configurable]]、[[writable]]等特性的默认值即变为false。不显式的设置它们的值为true,则该属性即为不可写、不可删。
不知以上总结是否正确,这里面又蕴含什么规律?书本仅说明这些特性的默认值为true是否忽略了一些情况?
本人为在校大学生,虚心请教各位大神。
自己实践出来就没错了,书只是参考。还有它指的默认值应该是针对对象字面量这种方式创建的对象,而不是Object.defineProperty
var o = {}; o.a = 1; 等同 Object.defineProperty(o, "a", {value : 1, writable : true, configurable : true, enumerable : true}); ============================= Object.defineProperty(o, "a", {value : 1}); 等同 Object.defineProperty(o, "a", {value : 1, writable : false, configurable : false, enumerable : false});
没用过,平时的开发中很少用,所以不清楚。。。