如果我有类似
的话class A {
constructor() {
this.test = function(){return 1;};
}
}
class B extends A {
constructor() {
super();
this.test = function(){alert( super.test() );};
}
}
这不起作用,但有没有办法可以访问父函数test()?
答案 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());
}
}