_Doogie
2016-03-21 17:48
1.当在对象里定义get / set 方法时,语法格式是:
var o = {
get func(){}
set func(){}
}
而在Object.defineProperty中重新定义属性时,语法却是这样(假设obj里有一个“name"属性
Object.defineProperty(obj,"name",{
get: function(){}
set: function(){}
})
2.在定义对象时,所有的数据属性默认为true(其中包括configurable,enumrable,writable,value),当然value是赋值的
当调用Object.defineProperty时所有默认为true的属性都变为false,只有自己手动去设置为true,configurable为true时代表传入Object.defineProperty的对象属性时可修改或者delete的,而enumrable是可枚举的(即能在for in循环中输出),writable代表属性值是否可写
3.对于视频中的例子,因为不太记得所以只能自己尝试写了..
var o = { value : 1};
Object.defineProperty(o,value,{writable:false});//此时除writable其他属性已经变为false;
o.value;//值为1
o.value = 100;//因为属性writable为false,所以值不可写
o.value;// 值还是为1
var obj = Object.create(o);//创建一个以o为原型的新对象
obj.value;// 值为1,通过实例-> 原型可查找到
obj.value = 100;//此时为obj添加了一个实例属性,值为100,覆盖原型o中的value
obj.value;//值为100
delete obj.value//因为默认的数据属性都为true,所以可删除
obj.value;//此时的value属性又是原型o中的value了
Object.defineProperty(obj, 'z',
{value : 100, configurable: true});
最后只能这样修改OBJ的z值!
错了!!对于第三点,当对象用defineProperty这种方式定义属性时。且writable为false。该对象的子对象也是不可写的,所以你的obj.value再怎么更改也是1、除非你用defineProperty再去定义obj中的value属性,视频中的最后几分钟的例子就是在说明这个!!请再回去仔细看看!!
真棒!
JavaScript深入浅出
281102 学习 · 1020 问题
相似问题