我在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
答案 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