调用父方法(原型)

时间:2015-03-12 12:06:39

标签: javascript prototype

我有这段代码:

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");

显然在第一个你传递上下文的时候,但是从那个开始,这两者之间有什么区别?

2 个答案:

答案 0 :(得分:0)

好点。

正如您所说,call用于更改方法的上下文,但鉴于在init方法中未使用的事实,两个表达式都是等效的。基本上,根据您的具体示例,您可以通过这种方式调用init来有效地结束:Shape.prototype.init(coords,"blue");

答案 1 :(得分:0)

你永远不应该假设超类函数不需要它的上下文。

仅仅因为.init方法现在不使用它,并不意味着它永远不会。由于创建的Block对象是创建的并且将立即GCed,因为该函数看起来大部分都是无用的,因为没有别的东西可以引用它们。

另外,理论上你可以写:

this.init(coords, "blue")

并且原型机制将自动从超类中调用该方法,而无需您明确地命名它。

如果您随后将init方法添加到I_Shape,那么那个的地方应该从中调用超类的init方法,而不是从构造函数中调用。{{1}}方法。