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

以我的理解,我们正在创建一个具有构造函数的类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/

10-13 04:10