2017-05-04 151 views
1

在以下代码行中,根据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; 

这是他们前面的例子上做了说明:

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

+3

这似乎是教程代码中的一个缺陷。除''this'之外''Shape.call'的附加参数被忽略。此外,从“Shape”构造函数中访问全局变量“width”和“height”会感觉像抽象的抽象。 –

+0

谢谢!我也这么想。我想知道为什么教程说他们需要在'Ball'构造函数中被指定为参数。 – traincj

+1

我怀疑'Shape'构造函数应该把'x'和'y'作为参数,而不是随机初始化它们。那么这是有道理的。 –

回答

1

我是最初编写这些文档的人。我必须给的混乱一个大的道歉开始引起的 - 我的脑子是出去吃午饭的那一天; -/

我已经更新了代码和实例来解决问题,因为记录在这个GitHub的问题:

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

如果您发现MDN内容有任何问题,请让我知道。

谢谢。

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。