1

我认为它们是等效的,但我不确定:

var __extends = function(child, parent) { 
    for (var key in parent) { 
        if (__hasProp.call(parent, key)) child[key] = parent[key]; 
    }
    function ctor() { 
        this.constructor = child; 
    } 
    ctor.prototype = parent.prototype; 
    child.prototype = new ctor; 
    child.__super__ = parent.prototype;
    return child; 
};

var __extends = function(child, parent) { 
    for (var key in parent) { 
        if (__hasProp.call(parent, key)) child[key] = parent[key]; 
    }
    child.prototype = parent.prototype;
    child.prototype.constructor = child;
    child.__super__ = parent.prototype;
    return child; 
};
4

1 回答 1

1

这两个函数都使用对象的所有属性扩展child(函数)对象parent,并且它们设置__super__属性。然后差异开始:

function ctor() { 
    this.constructor = child; 
} 
ctor.prototype = parent.prototype; 
child.prototype = new ctor;

此代码创建一个原型对象,child该对象继承自parent.prototype. 这是旧版本Object.create()功能。这是经典的 JavaScript 继承模式。

child.prototype = parent.prototype;
child.prototype.constructor = child;
child.__super__ = parent.prototype;

这段代码很垃圾。它将child的原型对象设置为parent.prototype,但在下一行中忘记了现在两个属性都指向同一个对象 ( child.prototype === parent.prototype)。因此,parent.prototype.constructor === childchild.__super__ === child.protoype- 呃。

于 2012-08-04T01:42:49.480 回答