我有这段代码:
function Shape() {}
Shape.prototype.init = function(coords, color) {
for(var i=0;i<coords.length;i++)
var block= new Block (coords[i],color);
};
Shape.prototype.draw = function() {
};
// ============= I_Shape ================================
function I_Shape(center) {
var coords = [new Point(center.x - 2, center.y),
new Point(center.x - 1, center.y),
new Point(center.x , center.y),
new Point(center.x + 1, center.y)];
Shape.prototype.init.call(this, coords, "blue");
}
I_Shape.prototype = new Shape();
I_Shape.prototype.constructor = I_Shape;
我想知道为什么会有一个&#39; init.call(...)&#39;在I_Shape函数的最后一行。是否有必要(在父函数中不使用上下文),或者可以用以下行替换?
Shape.prototype.init(coords,"blue");
显然在第一个你传递上下文的时候,但是从那个开始,这两者之间有什么区别?
答案 0 :(得分:0)
好点。
正如您所说,call用于更改方法的上下文,但鉴于在init
方法中未使用的事实,两个表达式都是等效的。基本上,根据您的具体示例,您可以通过这种方式调用init
来有效地结束:Shape.prototype.init(coords,"blue");
答案 1 :(得分:0)
你永远不应该假设超类函数不需要它的上下文。
仅仅因为.init方法现在不使用它,并不意味着它永远不会。由于创建的Block对象是创建的并且将立即GCed,因为该函数看起来大部分都是无用的,因为没有别的东西可以引用它们。
另外,理论上你可以写:
this.init(coords, "blue")
并且原型机制将自动从超类中调用该方法,而无需您明确地命名它。
如果您随后将init
方法添加到I_Shape
,那么那个的地方应该从中调用超类的init
方法,而不是从构造函数中调用。{{1}}方法。