将__proto__设置为null然后重新设置它会破坏Javascript中的instanceof

时间:2015-10-05 03:20:23

标签: javascript prototype instanceof

我在JavaScript中乱搞时遇到了一些奇怪的行为

function Class() {};
var a = {};

a.__proto__ = Class.prototype
a instanceof Class => true

将proto设置为null,然后为其重新赋值相同的值使instanceof运算符返回false而不是true。

a.__proto__ = null
a.__proto__ = Class.prototype
a instanceof Class => false

2 个答案:

答案 0 :(得分:4)

我引导您注意:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

  

警告:根据现代JavaScript引擎如何在每个浏览器和JavaScript引擎中优化属性访问,非常慢的操作,改变对象的[[Prototype]]。对改变继承的性能的影响是微妙和遥远的,并不仅仅局限于在obj。 proto = ...语句中花费的时间,但可以扩展到任何有权访问的代码。任何[[原型]]被改变的物体。如果您关心性能,则应避免设置对象的[[Prototype]]。而是使用Object.create()创建一个具有所需[[Prototype]]的新对象。

并且

  

警告:虽然目前大多数浏览器都支持Object.prototype。 proto ,但它的存在和确切行为仅在ECMAScript 6规范中标准化,作为确保Web浏览器兼容性的传统功能。为了获得更好的支持,建议仅使用Object.getPrototypeOf()。

简而言之,你正在破坏事物,然后问他们为什么会被打破。 __proto__并不意味着被改变,并且没有标准化的行为,所以你不能依赖它做你想做的事。

你想做什么?你的最终目标是什么?

答案 1 :(得分:0)

[![2 protos] [1]] [1]

虽然我不确定你为什么要这样做,但检查员会发现该对象有两个 proto 属性。考虑到属性名称应该是唯一的,这也是一个奇怪的问题。如果你想要一些半解释(非解释),两个 proto 属性混乱了instanceOf