与使用继承/原型的JavaScript代码段混淆

问题描述 投票:0回答:1

我对这个简单的代码片段有些困惑。我对原型不是很熟悉,在看了几段视频并阅读了该主题后仍然感到困惑。

据我所知,我们正在创建一个具有构造函数的Rectangle类。然后我们创建一个功能区域,它是Rectangle的原型。

然后,我们正在创建Square,该Square继承了Rectangle的属性。问题是这两行

    constructor(s) { 
    super(s, s);

我想我的问题是为什么我们同时使用构造函数和super(s,s)。我以为super()的工作是调用父级的构造函数。

如果构造函数正在调用Rectangle的构造函数,为什么不要求两个变量的高度和宽度?

代码:

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());
javascript prototype
1个回答
0
投票

您不能在孩子的构造函数之外调用super,因为super像构造函数一样,仅在最初创建该对象的实例时才使用。

因此在您的示例中:

平方仅接受一个参数,因为两边的平方相等。与矩形不同,矩形的长度与高度不同。从技术上讲,所有正方形都是矩形,但是那不是该点。

这是可行的,因为您可以在方形班级中看到:

 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原型。

© www.soinside.com 2019 - 2024. All rights reserved.