Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

原型链中包含特殊属性的问题

  当我们访问JavaScript的对象属性时候,如果属性不存在,而且原型链中存在则会去原型链中取。如果是写入操作就会直接写在操作对象上。但在ES5中写入操作时候还需要调用[[CanPut]]来验证,如果原型链中的操作属性包含了不可写的性质通常就会写入失败。
<script>
"use strict";
var p={};
Object.defineProperty(p,"name",{value:"次碳酸钴"});
var O=function(){};
O.prototype=p;
var o=new O;
</script>

  但是这在Chrome中有个BUG,原因是v8中对普通属性(字符串)和元素属性(自然数)使用不同的实现方式。上面的代码使用了name这个属性名,可以正常抛出异常,但换成自然数属性名就不会被原型链中的[[Writable]]影响了。
<script>
"use strict";
var p={};
Object.defineProperty(p,0,{value:"次碳酸钴"});
var O=function(){};
O.prototype=p;
var o=new O;
console.log(o[0]);
o[0]="test";
console.log(o[0]);
</script>

  使用Object.defineProperty这样的正规方式设置的元素属性还算比较正常的,Chrome上的这个BUG过段时间就能修复。但对于一些自带只读属性的对象,在同样的情况下就会出现更麻烦的结果。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^