首页 新闻 赞助 找找看

关于javascript的一些原形属性问题。。。纠结

0
悬赏园豆:10 [待解决问题]

a = [1,2,3]; //这里Array.prototype是a的原形没错吧

Object.getOwnPropertyDescriptor(a,"length");

//这里输出 Object{value: 4, writable: true, enumerable: false, configurable: false}

//但是当我执行 Object.defineProperty(a,"length",{writable:false})后,他的writable就被修改了,可是configurable不是false么 为什么还可以修改,而且执行a.length=5后就真的没有修改掉这个值

关键是能修改就能修改吧,当我改Array.prototype的length的writable时也显示的是修改成功修改为false,但当重新申请一个对象 c =  Object.create(Array.prototype)

Object.getOwnPropertyDescriptor(c,"length"); //竟然是 undefined  

但是我访问c.length 的值为0;这里是怎么继承的啊。。。搞不懂。。。

フ天天好心情的主页 フ天天好心情 | 初学一级 | 园豆:200
提问于:2013-10-21 23:33
< >
分享
所有回答(4)
0

第一个问题是在非严格模式下,可以把true的属性值改为false,但是并不可以把false改为true

第二个问题是先申请了之后c数组并没有自己的属性值length,所以为undefined 当我访问c.length时,实际访问的是Array.prototype.length 的值,如果这个值属性是可写的,那么当第一次给c.length赋值时会在c中创建一个length属性覆盖掉继承的属性,但原对象的值并不修改。如果这个值属性是不可写的,那么在c中赋值length是无效的,访问的永远是原型对象的属性

フ天天好心情 | 园豆:200 (初学一级) | 2013-10-22 12:51
0

你應該用Object.seal(a);

simonleung | 园豆:211 (菜鸟二级) | 2013-10-22 13:59
0

第一个问题:configurable和writable没有必然的联系吧。writable控制属性值,configurable控制属性。

第二个问题:因为属性是只读的,所以只有在查询属性的时候才会体会到继承的存在。c.length其实是原型对象的属性。

snowinmay | 园豆:240 (菜鸟二级) | 2013-11-14 17:32
0

第一:

a = [1,2,3]; Object.getOwnPropertyDescriptor(a,"length");

输出的是这个吧:configurable:false,enumerable:false,value:3,writable:true,

configurable:false是他的默认值,false表示可以修改配置的

第二:getOwnPropertyDescriptor获取的是对象自己的属性,不包括原型链上的属性和继承而来的属性的.

c =  Object.create(Array.prototype)

这里的c是个object对象,内部怎么可能有length属性呢,javascript中不存在的值都是"undefind";

思思博士 | 园豆:224 (菜鸟二级) | 2013-12-09 12:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册