首页 新闻 会员 周边

关于JavaScript数据[[属性特性]]的疑问

1
悬赏园豆:100 [已解决问题] 解决于 2013-08-31 09:51

根据《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是否忽略了一些情况?

本人为在校大学生,虚心请教各位大神。

黄映焜的主页 黄映焜 | 初学一级 | 园豆:112
提问于:2013-08-23 23:04
< >
分享
最佳答案
1

自己实践出来就没错了,书只是参考。还有它指的默认值应该是针对对象字面量这种方式创建的对象,而不是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});
收获园豆:100
Yu | 专家六级 |园豆:12980 | 2013-08-24 08:53
其他回答(1)
0

没用过,平时的开发中很少用,所以不清楚。。。

乐享程序员 | 园豆:930 (小虾三级) | 2013-08-24 08:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册