如何在es6 javascript类中获取父函数?

时间:2017-06-17 07:15:05

标签: javascript ecmascript-6

如果我有类似

的话
class A {
    constructor() {
        this.test = function(){return 1;};
    }
}

class B extends A {
    constructor() {
        super(); 
        this.test = function(){alert(  super.test()   );};
    }
}

这不起作用,但有没有办法可以访问父函数test()?

1 个答案:

答案 0 :(得分:5)

  

这不起作用,但有没有办法可以访问父函数test()?

由于您未使用原型作为基类方法,因此您无法使用super.test()来引用它。相反,this.test只是当前对象的属性。如果由于某些原因您不想将原型用于方法,您可以这样做:

class A {
    constructor() {
        this.test = function(){return 1;};
    }
}

class B extends A {
    constructor() {
        super();
        let priorTest = this.test; 
        this.test = function(){alert(  priorTest.call(this)   );};
    }
}

要进一步说明,只有一个this.test属性,因此当您在B类中分配this.test = ...时,您会覆盖之前的this.test,这样您就无法做到在实施中参考它。但是,您可以在覆盖它之前保存其值,然后使用它。

此外,有些人错误地认为this引用基类方法中的不同对象与派生类方法。事实并非如此。只有一个对象,基类和派生类都有该对象的方法。因此,基类中的this.test = xxx引用与派生类中的this.test = yyy完全相同的属性。原型上定义的方法实际上保存在单独的对象上,因此它们都可以独立存在。当你引用this.test并且没有"拥有"直接在当前对象上的属性,然后Javascript将搜索原型链以查看它是否在原型链中找到具有所需名称的属性。如果是,那么它将返回/执行那个。

ES6的方法是使用ES6语法定义将使用原型的方法然后你可以使用super.test()来引用基类实现,因为在原型链中每个类都有自己的如果没有"拥有"则定义搜索方法的对象。具有指定名称的属性。

class A {
    constructor() {
    }
    test() {
        return 1;
    }
}

class B extends A {
    constructor() {
        super(); 
    }
    test() {
        alert(super.test());
    }
}