这个简单的代码片段让我有些困惑。我对原型不是很熟悉,并且在观看了一些视频并阅读了有关该主题后仍然感到困惑。
据我了解,我们正在创建一个具有构造函数的类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());
答案 0 :(得分:3)
您不能在孩子的构造函数之外调用super(),因为super()就像构造函数一样,仅在最初创建该对象的实例时才使用。
在您的示例中:
Square仅接受1个参数,因为两边的平方相等。与矩形不同,矩形的长度与高度不同。从技术上讲,所有正方形都是矩形,但是除了该点之外。
这行得通,因为您可以在方形班级中看到
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原型继承的。