【问题标题】:Calling a parent method (prototype)调用父方法(原型)
【发布时间】:2015-03-12 12:06:39
【问题描述】:

我有这个代码:

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;

我想知道为什么在 I_Shape 函数的最后一行有一个“init.call(...)”。是否有必要(在父函数中不使用上下文),还是可以换成下面这行?

Shape.prototype.init(coords,"blue");

显然在第一个中您传递了上下文,但除此之外,这两者之间有什么区别?

【问题讨论】:

    标签: javascript prototype


    【解决方案1】:

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

    仅仅因为 .init 方法现在不使用它,并不意味着它永远不会。因为这个函数看起来几乎没用,因为创建的 Block 对象被创建并且将立即被 GC,因为没有其他东西持有对它们的引用。

    另外,理论上你可以写:

    this.init(coords, "blue")
    

    并且原型机制会自动调用超类中的方法,而无需您显式命名。

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

    【讨论】:

      【解决方案2】:

      说得好。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-29
        • 1970-01-01
        • 2016-09-01
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多