我正在学习 JavaScript 的第三天。我遇到了这段代码:
class B {
constructor(name) {
this.name = name;
}
printn() {
return this.name;
}
}
class A extends B {
constructor(name, age) {
super(name);
this._age = age;
}
get age() {
return this._age;
}
printName(){
return super.printn();
}
}
let c = new A("Testing", "37");
Console.log(c.printn());
谁能解释一下这段代码的作用。构造函数和 super() 关键字是什么?我相信他们是为了继承?我在谷歌上找到了一些东西,但这似乎是最简单的例子,而且几乎没有解释。
我无法让这段代码工作。
什么是构造函数和 super() 关键字。我相信这是为了继承?
这是正确的。上面设置了类B
然后上课A
它的子类。这constructor
是创建该类的新实例时调用的函数,如let c = new A("Testing", "37");
代码中的行。与其他一些语言不同,在 JavaScript 中,一个类只能有一个构造函数。
super
在子类中使用来引用超类。在构造函数中,您call super
就好像它是一个函数,并且调用超类的构造函数,使其有机会对由以下方法创建的新对象进行初始化new
。例如,在A
's constructor
, super()
calls B
's constructor
.
您还可以使用super
作为属性访问器表达式的源来访问超类上的属性(包括方法)。这就是发生的事情A
's printName
方法,它使用的地方super.printName()
打电话B
's printName
方法。 (这会失败,因为B
没有printName
方法;B
的方法被称为printn
.)
如果我没有指出,虽然这看起来很像 Java 或 C# 中基于类的 OOP,但事实并非如此,那就是我的失职了。它是用于设置 JavaScript 正常的语法糖(很好的糖)原型的使用构造函数进行继承。它极大地简化了使用构造函数设置原型继承层次结构的过程。如果我没有指出使用构造函数来进行原型继承是不必要的,那么我也是失职的,您可以通过以下方式进行原型继承而不使用构造函数Object.create
.
还有很多值得探索的地方。MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/class可能是一个很好的起点。
我无法让这段代码工作。
The C
in Console.log
不应该大写,所以改变
Console.log(c.printn());
to
console.log(c.printn());
除此之外,如果您使用的 JavaScript 引擎支持class
(例如 Google Chrome 或 Mozilla Firefox 中的代码),该代码可以正常工作,但请再次注意A
似乎期待B
有一个printName
方法,但没有,最后的代码正在调用printn
这仅B
有(这很好,它只是意味着A
的代码并没有真正涉及)。
class B {
constructor(name) {
this.name = name;
}
printn() {
return this.name;
}
}
class A extends B {
constructor(name, age) {
super(name);
this._age = age;
}
get age() {
return this._age;
}
printName(){
return super.printName();
}
}
let c = new A("Testing", "37");
console.log(c.printn());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)