Backbone.extend函数究竟是如何工作的?

5us2dqdw  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(178)

我想知道这个extend函数在Backbone.js中是如何工作的,请帮助我了解它在内部到底是做什么的。

var extend = function(protoProps, staticProps) {
    var parent = this;
    var child;

    // The constructor function for the new subclass is either defined by you
    // (the "constructor" property in your `extend` definition), or defaulted
    // by us to simply call the parent constructor.
    if (protoProps && _.has(protoProps, "constructor")) {
      child = protoProps.constructor;
    } else {
      child = function() {
        return parent.apply(this, arguments);
      };
    }

    // Add static properties to the constructor function, if supplied.
    _.extend(child, parent, staticProps);

    // Set the prototype chain to inherit from `parent`, without calling
    // `parent`'s constructor function and add the prototype properties.
    child.prototype = _.create(parent.prototype, protoProps);
    child.prototype.constructor = child;

    // Set a convenience property in case the parent's prototype is needed
    // later.
    child.__super__ = parent.prototype;

    return child;
  };

这里为什么父变量被添加到子变量?

ff29svar

ff29svar1#

extend采用两个参数protoPropsstaticPropsprotoProps是将分配给类原型的属性,以便在创建对象的示例时,该对象将具有作为其原型链1的一部分的该属性。staticProps是从类创建的对象不可用的属性(使用new),但是可以从类别本身存取,例如,借由呼叫CatClass.defaultMeow

var extend = function(protoProps, staticProps) {
    var parent = this;
    var child;

在下面的讨论中,parent是我们将称为基类的类,我们希望将其原型扩展为child,在这里我们将其称为扩展类。

// The constructor function for the new subclass is either defined by you
    // (the "constructor" property in your `extend` definition), or defaulted
    // by us to simply call the parent constructor.
    if (protoProps && _.has(protoProps, "constructor")) {
      child = protoProps.constructor;

如果protoProps是函式,或具有constructor属性(这是每当您在类别上呼叫new时所叫用的属性(做为方法))。

} else {
      child = function() {
        return parent.apply(this, arguments);
      };
    }

如果不是,扩展类将使用父类的constructor(当调用new时,它将调用父类的constructor方法)。

// Add static properties to the constructor function, if supplied.
    _.extend(child, parent, staticProps);

_.extend(target, src1,...,srcN) UnderscoreJS方法将源对象的属性浅层复制到目标对象。这里我们将所有父对象(静态)属性和传递给staticProp对象(如果提供)的所有属性复制到新的扩展类。

// Set the prototype chain to inherit from `parent`, without calling
    // `parent`'s constructor function and add the prototype properties.
    child.prototype = _.create(parent.prototype, protoProps);

这可能是Backbone.extend例程最重要的功能:这是扩展类“继承”基类原型链的地方。例如,如果AnimalClass.prototype.walkAnimalClass的原型链中的一个方法,则_.create(parent.prototype, protoProps)将使用此新类原型链中的walk方法以及传入的所有protoProps创建一个新类。本质上,这_extended prototype链',并将其作为原型分配给扩展类。

child.prototype.constructor = child;

这一行一开始很混乱,因为我们在上面的条件语句中看到扩展类已经被分配了一个构造函数。好吧,它确实被分配了,但是在最后一条语句中,当我们执行_.create(...)时,我们用基类的构造函数覆盖了扩展类的构造函数!现在我们重新分配它。

// Set a convenience property in case the parent's prototype is needed
    // later.
    child.__super__ = parent.prototype;

正如注解所说,扩展类可以访问***静态属性 * __super__中的基类。这是一个方便的属性,可以从扩展类对象本身访问。在我们前面的例子中,如果CatClass是从AnimalClass扩展而来的,则以下为真:CatClass.__super__ === AnimalClass .

return child;
  };

相关问题