通过传递构造函数参数继承属性

时间:2017-05-04 14:25:03

标签: javascript inheritance

在以下代码行中,改编自Mozilla JavaScript tutorial的解决方案,Ball类继承Shape类的x,y属性。

Mozilla page似乎暗示要从Shape继承x,y,它们必须在Ball构造函数的参数列表中定义(并在Shape.call函数调用中使用)。但为什么这有必要呢?原始的Shape构造函数不接受任何这些参数。

假设random是在别处定义的函数。

var width = canvas.width = window.innerWidth;
var height = canvas.height = window.innerHeight;

function Shape() {
  this.x = random(0,width);
  this.y = random(0,height);
}

function Ball(x, y) {
  Shape.call(this, x, y);
  this.size = random(10,20);
}

Ball.prototype = Object.create(Shape.prototype);
Ball.prototype.constructor = Ball;

这是他们在前一个例子中做的一个注释:

“在这种情况下,我们在创建新对象实例时指定继承的属性,但请注意,即使实例不要求将它们指定为参数,也需要在构造函数中将它们指定为参数(例如,在创建对象时,您可能已经将属性设置为随机值。)“

2 个答案:

答案 0 :(得分:1)

我是最初编写这些文档的人。我必须首先对引起的混乱道歉 - 那天我的大脑出去吃午饭; - /

我更新了代码和示例以解决问题,如此GitHub问题中所述:

https://github.com/mdn/learning-area/issues/7

如果您发现MDN内容出现任何问题,请与我们联系。

感谢。

答案 1 :(得分:0)

如果Shape()函数在x,y上运行并对x,y进行一些验证/操作,则传递x,y是有意义的。原因是你不想在Ball()中重做那项工作。

但由于简单的赋值不保证传递x,y,因为x,y无论如何都会附加到this个对象。

this.x = random(0,width);
this.y = random(0,height);

因此,看起来不需要传递x,y。

相关问题