根据《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是否忽略了一些情况?
本人为在校大学生,虚心请教各位大神。
2 回答
PIPIONE
TA贡献1829条经验 获得超9个赞
自己实践出来就没错了,书只是参考。还有它指的默认值应该是针对对象字面量这种方式创建的对象,而不是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});
添加回答
举报
0/150
提交
取消