为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

素胚勾勒不出你 2018-12-06 18:45:48
根据《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});
查看完整回答
反对 回复 2018-12-24
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

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

查看完整回答
反对 回复 2018-12-24
  • 2 回答
  • 0 关注
  • 502 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信