正确的方法来实现原型继承

时间:2013-09-21 10:23:58

标签: javascript prototype prototypal-inheritance

我想在一些之间建立继承关系。例如,Element将成为抽象超类,然后RectTriangle作为子类

除了在其原型上设置的常用函数之外,

Element在其构造函数中有一些公共代码。

Element = function (id, attr) {
    // Setting attributes and id...
    this._callback_click = _bind(this._callback_click, this);
};

我一直在阅读一些问题,such as this,似乎有不止一种方法可以实现,尽管最终可能等同。

  1. 使用new

    Rect = function (id, attr) {
        Element.call(this, id, attr);
        // Setting Rect's own attributes...
    };
    
    Rect.prototype = new Element(null, {});
    Rect.prototype.constructor = Rect;
    // Seems somewhat pointless to pass these arguments, but I have none
    // at this point in the code.
    
  2. 使用Object.create

    Rect = function (id, attr) {
        Element.call(this, id, attr);
        // Setting Rect's own attributes...
    };
    
    Rect.prototype = Object.create(Element.prototype);
    Rect.prototype.constructor = Rect;
    
  3. 使用临时构造函数

    function makePrototype(superclass) {
        function f() { }
        f.prototype = superclass.prototype;
        f.prototype.constructor = f;
        return new f();
    }
    
    Rect = function (id, attr) {
        Element.call(this, id, attr);
        // Setting Rect's own attributes...
    };
    
    Rect.prototype = makePrototype(Element);
    Rect.prototype.constructor = Rect;
    
  4. 使用clone

    function clone(object) {
        var key, copy = {};
        for (key in object) { copy[key] = object[key]; }
        return copy;
    }
    
    Rect = function (id, attr) {
        Element.call(this, id, attr);
        // Setting Rect's own attributes...
    };
    
    Rect.prototype = clone(Element.prototype);
    Rect.prototype.constructor = Rect;
    

  5. 这些方法中的任何一种方法都优于其他方法吗?

    我怀疑clone方法可能不是正确,虽然我不确定原因是什么。

    最后,如果我错了,请更正我,但我相信new方法可能会显示意外结果,因为_callback_click被绑定两次(设置原型时,以及调用{{1}时Element)内的构造函数。

0 个答案:

没有答案