对JavaScript继承/原型感到困惑

时间:2019-12-10 23:50:20

标签: javascript prototype

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

据我了解,我们正在创建一个具有构造函数的类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());

1 个答案:

答案 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原型继承的。

相关问题