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;这里是怎么继承的啊。。。搞不懂。。。
第一个问题是在非严格模式下,可以把true的属性值改为false,但是并不可以把false改为true
第二个问题是先申请了之后c数组并没有自己的属性值length,所以为undefined 当我访问c.length时,实际访问的是Array.prototype.length 的值,如果这个值属性是可写的,那么当第一次给c.length赋值时会在c中创建一个length属性覆盖掉继承的属性,但原对象的值并不修改。如果这个值属性是不可写的,那么在c中赋值length是无效的,访问的永远是原型对象的属性
你應該用Object.seal(a);
第一个问题:configurable和writable没有必然的联系吧。writable控制属性值,configurable控制属性。
第二个问题:因为属性是只读的,所以只有在查询属性的时候才会体会到继承的存在。c.length其实是原型对象的属性。
第一:
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";