通过传递构造函数参数继承属性
问题描述:
在以下代码行中,根据Mozilla JavaScript tutorial的解决方案进行了改编,Ball类从Shape类继承x,y属性。通过传递构造函数参数继承属性
Mozilla page似乎暗示要从Shape继承x,y,它们必须在Ball构造函数的参数列表中定义(并在Shape.call函数调用中使用)。但为什么这是必要的?原始的Shape构造函数不采用任何这些参数。
假设随机是其他地方定义的函数。
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;
这是他们前面的例子上做了说明:
“在这种情况下,我们指定,当我们创建一个新的对象实例继承属性,但请注意,你需要将其指定为即使实例不要求将它们指定为参数(例如,在创建对象时您可能已经设置了一个随机值)。“
答
我是最初编写这些文档的人。我必须给的混乱一个大的道歉开始引起的 - 我的脑子是出去吃午饭的那一天; -/
我已经更新了代码和实例来解决问题,因为记录在这个GitHub的问题:
https://github.com/mdn/learning-area/issues/7
如果您发现MDN内容有任何问题,请让我知道。
谢谢。
答
如果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。
这似乎是教程代码中的一个缺陷。除''this'之外''Shape.call'的附加参数被忽略。此外,从“Shape”构造函数中访问全局变量“width”和“height”会感觉像抽象的抽象。 –
谢谢!我也这么想。我想知道为什么教程说他们需要在'Ball'构造函数中被指定为参数。 – traincj
我怀疑'Shape'构造函数应该把'x'和'y'作为参数,而不是随机初始化它们。那么这是有道理的。 –