Web 技术研究所

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

再谈 __proto__ 属性

  使用__proto__来访问元素的[[Prototype]]内置属性已经是很普遍的用法,且不谈它是否符合规范,至少兼容性比规范的setPrototypeOfgetPrototypeOf更好。然而,对于这个__proto__,它到底是以什么样的状态存在于JavaScript中依然扑朔迷离。
  我一开始觉得它是一个存在于Object.prototype上的访问器属性,仅此而已。在一些用法上确实如此,比如如果浏览器支持__proto__但不支持setPrototypeOfgetPrototypeOf的话,可以这么做兼容:
<script>
//分别取出这货的 get 和 set 和绑定
var __proto__=Object.getOwnPropertyDescriptor(
  Object.prototype,"__proto__"
);
var getPrototype=__proto__.get;
var setPrototype=__proto__.set;

//添加到 Object 对象上
Object.getPrototypeOf=getPrototype.call.bind(getPrototype);
Object.setPrototypeOf=setPrototype.call.bind(setPrototype);

//测试
var test=/test/;
console.log(Object.getPrototypeOf(test));
Object.setPrototypeOf(test,{});
console.log(test);
</script>
  如果这是这样我也不会如此纠结了。实际上除了Object.prototype.__proto__这东西以外还存在一个更神秘的家伙。下面这段代码是什么情况呢?
<script>
//初始化一个对象,并且其 __proto__ 属性为null
var o={__proto__:null};
//什么!?这个属性居然没有添加到对象上?
console.log("__proto__" in o); //false
</script>
  对象字面量中的属性应该是直接被定义到对象上的,不应考虑任何原型链才对。如果__proto__只是以原型的形式存在的话,这个代码不应该吞掉对象字面量中带的__proto__。实际上,这段代码中对象字面量中带的__proto__是直接被作为其内置的[[Prototype]]属性来解析的,它的确不考虑原型链。这就意味着是对象字面量对__proto__这个名称做了特殊处理,这是完全独立于Object.prototype.__proto__的一种存在方式。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^