gpt4 book ai didi

javascript - 重新实现了 Constructor[Symbol.hasInstance] 但它仍然不会被调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:21:47 26 4
gpt4 key购买 nike

因此,我正在为 Constructor[Symbol.hasInstance] 编写一些实现另一个函数的示例代码,但我注意到我的新实现不会被调用。

下面的脚本是我所期望的:

function Pirate(name) {
this.name = name;
}

const jackSparrow = {
isPirate: true
};

// Notice how `jackSparrow` is not yet considered an instance of the `Pirate` object
console.log(jackSparrow instanceof Pirate); // false

// Now let's assign another function for `Pirate[Symbol.hasInstance]`
Pirate[Symbol.hasInstance] = function (anObj) {
return anObj.isPirate;
};

// This will cause Pirate[Symbol.hasInstance] to be called with `jackSparrow`
console.log(jackSparrow instanceof Pirate); // true

我尝试向我的 Pirate[Symbol.hasInstance] 实现添加一个 console.log 调用,但它不会在控制台记录任何内容。

有人知道发生了什么事吗?为什么我的实现没有被调用?

我在 Node 6.9.1 上运行它。

最佳答案

如果你这样做,你就能找到答案

Object.getOwnPropertyDescriptor( Function.prototype, Symbol.hasInstance).writable

它返回 false:您不能使用赋值 = 运算符写入函数的 Symbol.hasInstance 属性。该属性永远不会被设置,所以它永远不会被调用。 (默默地失败对我来说感觉像是无益的行为,但你去了。如果你处于严格模式,一个 TypeError 会抛出一条有用的消息,这是你应该一直使用它的众多原因之一。 ) 您只能在具有 Object.defineProperty 的函数上定义 Symbol.hasInstance 属性。

Object.defineProperty(Pirate, Symbol.hasInstance, {
value: function(anObj) {
console.log('Is he a pirate?');
return anObj.isPirate;
}
});

现在 jackSparrow instanceof Pirate 首先记录问题,然后返回 true

关于javascript - 重新实现了 Constructor[Symbol.hasInstance] 但它仍然不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40982924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com