gpt4 book ai didi

javascript - 如何在 JavaScript 中禁用继承者的 Symbol.hasInstance ?

转载 作者:行者123 更新时间:2023-12-02 22:58:06 24 4
gpt4 key购买 nike

我创建了一个代理类B,它通过Symbol.hasInstance将实例化检查重定向到类A。因此,如果我针对 B 类运行 instanceof 检查,A 类的任何继承者都会通过。

但是,我想继承 B 类,并且不希望继承者遵循 B 类逻辑。我希望他们拥有原来的身份并为他们运行默认的 instanceof 逻辑。在下面的代码中,它是一个 C 类。

但是,默认情况下,Symbol.hasInstance 属性是继承的。如何在 child 类(class)中禁用它?

class A {}

class B {
static [Symbol.hasInstance](instance) {
return instance instanceof A;
}
}

class C extends B {}

class D extends A {}

const d = new D();

console.log(d instanceof B); // should be true
console.log(d instanceof C); // should be false

我已经尝试过以下代码:

Object.defineProperty(C, Symbol.hasInstance, {value: null});

它适用于 Chrome 和 Firefox,但不适用于 Edge,并抛出以下错误:

The value of the property 'Symbol[Symbol.hasInstance]' is not a Function object

还有其他方法可以删除/禁用在 Edge 中也适用的 Symbol.hasInstance 吗?

最佳答案

它是一个方法,您可以使用 this 上下文检查它是在哪个类上调用的。因此,对于除 B 以外的所有内容,都回退到默认实现,因此很可能是继承该方法的 B 的子类:

class B {
static [Symbol.hasInstance](instance) {
if (this === B)
return A.prototype.isPrototypeOf(instance);
else
return this.prototype.isPrototypeOf(instance);
}
}

(请注意,您不能在此处使用 instanceof this,因为这会导致无限递归)

关于javascript - 如何在 JavaScript 中禁用继承者的 Symbol.hasInstance ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57898194/

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