ES6使用`super`出类定义

时间:2017-10-18 08:44:05

标签: javascript class ecmascript-6

我尝试向课程添加额外的方法,这些额外的方法应该使用super方法。

如果我在模型定义中添加它们,它就可以工作。

class A {
    doSomething() {
        console.log('logSomething');
    }

}

class B extends A {
    doSomething() {
        super.doSomething();
        console.log('logSomethingElse');
    }
}

如果我尝试将额外的方法添加到B.prototype,我将获得SyntaxError: 'super' keyword unexpected here

class A {
    doSomething() {
        console.log('logSomething');
    }

}

class B extends A {
}

B.prototype.doSomething = function doSomething() {
    super.doSomething();
    console.log('logSomethingElse');
}

很明显,为什么我会收到此错误。这是一个函数而不是类方法。

让我们尝试将方法定义为类方法,并将其复制到原始B类:

class A {
    doSomething() {
        console.log('logSomething');
    }

}

class B extends A {}

class X {
    doSomething() {
        super.doSomething();
        console.log('2 logSomethingElse');
    }
}

B.prototype.doSomething = X.prototype.doSomething;

在这种情况下,我会得到TypeError: (intermediate value).doSomething is not a function

有没有办法在原始类定义之外定义方法(引用super),然后将这些方法添加到原始类中?

3 个答案:

答案 0 :(得分:5)

super指的是定义方法的类的祖先,它不是动态的。正如Babel output说明的那样,super被硬编码为Object.getPrototypeOf(X.prototype),因此像这样的孤儿类没有意义,因为它没有{{1} }}:

super

class X { doSomething() { super.doSomething(); ... } } 可以用动态对应物代替:

super

在这种情况下,它将引用类实例的祖先类,其中doSomething() { const dynamicSuper = Object.getPrototypeOf(this.constructor.prototype); // or // const dynamicSuper = Object.getPrototypeOf(Object.getPrototypeOf(this)); dynamicSuper.doSomething(); ... } class B extends A {} B.prototype.doSomething = doSomething; 被指定为原型方法。

答案 1 :(得分:1)

虽然我认为这可以假设为反模式,但您不应该在super之外使用class

您可以使用Object Literals实现此目的。

请参阅Object.setPrototypeOf



const A = {
  sayHello() {
    console.log("I am A");
  },
  
  Factory() {
    return Object.create(this);
  }
}

const B = {
  sayHello() {
   super.sayHello();
  }
}

Object.setPrototypeOf(B, A);

const c = B.Factory();

c.sayHello();




答案 2 :(得分:-2)

如果你没有让类X继承自B类或A类,那么调用该方法的唯一方法是A.prototype.doSomething()或更普遍的A.prototype.doSomething.call(this_substitute, ...args)