Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “;超级”;可以调用基类方法和属性_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript “;超级”;可以调用基类方法和属性

Javascript “;超级”;可以调用基类方法和属性,javascript,ecmascript-6,Javascript,Ecmascript 6,在es6中,“super”可以调用基类,如: class A{ constructor(){ this.p = 2; } initF(){ return this.p } } class B extends A{ constructor(){ super(); console.log(super.p); // undefined console.log(super.initF()); // 2 } ff(){ cons

在es6中,“super”可以调用基类,如:

class A{
  constructor(){
    this.p = 2;
  }
  initF(){
    return this.p
  }
}

class B extends A{
  constructor(){
    super();
    console.log(super.p); // undefined
    console.log(super.initF()); // 2
  }
  ff(){
    console.log(super.initF()); // 2
  }
}

new B().ff();
很明显,我们只能调用基类(A)方法,而不能调用原型。为什么不能通过“super”访问基类原型?实际上可以

回答您的问题:JavaScript不会将继承的属性放在原型链上。如果需要,您需要自己设置:
A.prototype.p=5

如果您从另一个类继承,那么您的方法将放在原型上,因此它们将在类之间共享,并且您可以从基类覆盖该方法。那很好

现在,如果继承,则需要调用
super()
然后将调用基类的构造函数,您可以使用:
this.p
而不是
super.p
访问属性。因为这样,您将更改所有(下一个)继承类的属性(在原型中)——但这不是我们想要的。我们希望每个类都继承一个自己的属性

也许你可以看看
TypeScript
。你可以用更多的语法糖写更少的东西

A类{
构造函数(){
这个p=2;
}
initF(){
把这个还给我
}
}
B类扩展了A类{
构造函数(){
超级();
log(“super.constructor.prototype:”,super.constructor.prototype);
log(“super.constructor.prototype.p:”,super.constructor.prototype.p);
log('A.prototype.p',A.prototype.p');
log('this.\uuuuu proto\uuuuuu.',this.\uuuuu proto\uuuuuu.p);
console.log('super.p',super.p');
log(super.initF());
}
ff(){
log(super.initF());
}
}
C类扩展到B类{
构造函数(){
超级();
}
}
新的B().ff();
A.p=10;
新的C().ff()
super关键字用于调用对象父对象上的函数

super.prop和super[expr]表达式在任何方法中都有效 类和对象文本中的定义

您可以使用
this
访问父属性,但只能在基类
构造函数中调用
super()
后访问

更多阅读

A类{
构造函数(){
这个p=2;
}
initF(){
把这个还给我
}
}
B类扩展了A类{
构造函数(){
超级();
console.log(super.p);//无效=未定义
console.log(super().p);//valid=2
console.log(super.initF());//2
}
ff(){
console.log(super.initF());//2
}
}

新的B().ff()派生类从基类获取所有属性。因此您可以使用“this”访问基类中的所有属性。console.log(this.p);为什么不能通过“super”访问基类原型实际上,这就是您在示例中所做的。