Web 技术研究所

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

一个名叫 __proto__ 的属性

  在对象上访问 __proto__ 可以直接访问到对象的 [[Prototype]] 内部属性,这是因为 __proto__ 这玩意儿是被挂在 Object.prototype 上的一个访问器属性。如果对象自上没有这个属性就会访问到这个访问器属性。而且对象词法中也有规定对其的解析,所以它是个神奇的存在。
  我记得以前的文章「再谈 __proto__ 属性」中有扯过这个鬼。但是我还是很疑惑,比如 JSON 中如果带 __proto__ 会如何之类的事情。
<script>
var obj = JSON.parse('{"__proto__":233}');
document.write(obj.__proto__); // 233
</script>
  确实规范只是简单地劫持了这个属性名,很多情况下我们都可以设置这个属性而不调用 Object.prototype 上的访问器属性。比如使用 Object.defineProperty 或 ES6 的双重中括号词法。
var a = {};
var a = Object.defineProperty(a, '__proto__', { value: 233 });
var b = { [["__proto__"]]: 1 };
console.log(a.__proto__); // 233
console.log(b.__proto__); // 233
  这个 __proto__ 是我比较讨厌的东西之一。既然定义了 getPrototypeOf 和 setPrototypeOf,为什么还要放一个这么恶心的东西在规范里面?而且不仅仅是对象级的,连词法级都受影响,这是有多丧心病狂?或者既然连词法级都做了定义,为什么偏偏又做不完美,依然有许多方式可以定义这个名为 __proto__ 的属性?是我不懂它的世界观呢还是它确实太诡异了?
网名:
54.226.58.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^