【问题标题】:Setting __proto__ to null and then re-setting it breaks instanceof in Javascript [duplicate]将__proto__设置为null然后重新设置它会破坏Javascript中的instanceof [重复]
【发布时间】:2015-10-05 03:20:23
【问题描述】:

我在使用 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

【问题讨论】:

  • 您是在指出您认为的错误,还是您有实际问题?你想做什么?

标签: javascript prototype instanceof


【解决方案1】:

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

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

还有

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

简而言之,您正在破坏事物,然后询问它们为什么会被破坏。 __proto__ 并不是要被改变的,也没有标准化的行为,所以你不能依赖它来做你想做的事情。

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

【讨论】:

  • 感谢您的回复。我对 JavaScript 相当陌生,并且正在学习新的运算符。我想我在这里试图做的是弄清楚是什么让一个对象成为某个事物的实例。
  • 我建议您查看 instanceof 的文档。
【解决方案2】:

[![2 个原型][1]][1]

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

混淆

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多