【问题标题】:Is it possible to make a class A in Javascript which "class extends A {} instanceof A" is true?是否可以在 Javascript 中创建一个“class extends A {} instanceof A”为真的类 A?
【发布时间】:2020-10-21 14:40:45
【问题描述】:

是否可以创建一个类A(可以是ES 6 类或旧式构造函数)使得class extends A {} instanceof A 为真?

如果可以,请举个例子。 如果不是,请给我一个证明。

请注意,通过操纵原型链可以实现类B 使得new B instanceof Bnew new B instanceof B 同时为真。可以编写一个B 以使new B 满足class extends B {} 的预期行为,但我还想研究使class extends A {} 满足new A 的预期行为的A 的可能性也是。

这与我刚刚发布的my code golf 有关,但是在这个问题中我想调查反向的可能性 - 使class extends A {} 的行为类似于new A,而代码高尔夫是使@987654335 @ 的行为类似于 class extends A {}

【问题讨论】:

    标签: javascript class inheritance


    【解决方案1】:

    有可能。

    首先,A 的明显值是ObjectFunction。这两个将使表达式为真。

    对于A 的任何其他值,您必须将其原型设置为其prototype 属性值:

    Object.setPrototypeOf(A, A.prototype);
    

    我想这只是“体育”,因为它会给其他查询带来意想不到的结果,例如:A instanceof Function。通过操纵A 的原型链,这不再是真的。尽管如此,A 仍然可以执行,因为它仍然具有内部的 [[Call]] 插槽。

    这是一个说明上述内容的 sn-p:

    function test1() {
      let A = Object;
      console.log(class extends A {} instanceof A); // true
      A = Function;
      console.log(class extends A {} instanceof A); // true
    }
    
    function test2() {
      class A {
        speak() { console.log("hello") }
      }
    
      Object.setPrototypeOf(A, A.prototype);
    
      console.log(class extends A {} instanceof A); // true
      console.log(A instanceof Function); // false
      new A().speak(); // hello
    }
    
    test1();
    test2();

    【讨论】:

    • 我正在考虑创建一个可以将pass this testnew (getDerivedClass(level - 1)) 替换为class extends getDerivedClass(level - 1) {} 的类。你觉得这可能吗?
    • 抱歉,我对测试框架不太熟悉。如果您有新问题,请随时发布,提供必要的标签,这将决定谁会被您的问题所吸引。
    猜你喜欢
    • 2011-03-20
    • 2023-04-04
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多