我对这个简单的代码片段有些困惑。我对原型不是很熟悉,并且在观看了一些视频并阅读了有关该主题的内容后仍然感到困惑。
以我的理解,我们正在创建一个具有构造函数的类Rectangle
。然后我们创建
一个功能区,它是Rectangle
的原型。
那么我们创建的Square
继承了Rectangle
的属性。问题是这两行:
constructor(s) {
super(s, s);
我想我的问题是为什么我们同时使用构造函数和
super(s, s)
。我以为super()
的工作是调用父级的构造函数。如果构造函数正在调用
Rectangle
的构造函数,为什么不要求两个变量的height和width?码:
class Rectangle {
constructor(w, h) {
this.w = w;
this.h = h;
}
}
Rectangle.prototype.area = function() {
return (this.w * this.h);
}
class Square extends Rectangle {
constructor(s) {
super(s, s);
}
}
const rec = new Rectangle(3, 4);
const sqr = new Square(3);
console.log(rec.area());
console.log(sqr.area());
最佳答案
您不能在孩子的构造函数之外调用super(),因为super()就像构造函数一样,仅在初次创建该对象的实例时才使用。
因此,在您的示例中:
Square只接受一个参数,因为两边的平方相等。与矩形不同,矩形的长度与高度不同。从技术上讲,所有正方形都是矩形,但是除了该点之外。
这行得通,因为您可以在方形班级中看到:
class Square extends Rectangle {
constructor(s) {
super(s, s);
}
Square接受s,在此示例中为3。由于父类Rectangle接受用于定义宽度和高度的参数,因此Square调用Rectangle构造函数,并为宽度和高度传入3。同样,这是因为正方形具有相等的宽度和高度。
您不必将参数传递给构造函数即可调用超级。你可以这样做:
class Square extends Rectangle {
constructor() {
super(3, 3);
}
但这将是一种不好的做法,因为您没有使Square类可重用。
原型是类从其他类继承方法的一种方式。
例如,我们有String原型。原型带有各种方法。
const str = "hello world"
在这里,我们定义了一个称为str的字符串。由于str是一个字符串,因此可以使用String原型中定义的方法。
console.log(str.length)
在这里,我们使用String原型中定义的方法length来获取字符串的长度。注意到我们如何从未在任何地方定义方法长度?其继承自String原型。
关于javascript - 对JavaScript继承/原型(prototype)感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59277012/