我想知道这个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;
};
这里为什么父变量被添加到子变量?
1条答案
按热度按时间ff29svar1#
extend
采用两个参数protoProps
和staticProps
。protoProps
是将分配给类原型的属性,以便在创建对象的示例时,该对象将具有作为其原型链1的一部分的该属性。staticProps
是从类创建的对象不可用的属性(使用new
),但是可以从类别本身存取,例如,借由呼叫CatClass.defaultMeow
。在下面的讨论中,
parent
是我们将称为基类的类,我们希望将其原型扩展为child
,在这里我们将其称为扩展类。如果
protoProps
是函式,或具有constructor
属性(这是每当您在类别上呼叫new
时所叫用的属性(做为方法))。如果不是,扩展类将使用父类的
constructor
(当调用new
时,它将调用父类的constructor
方法)。_.extend(target, src1,...,srcN)
UnderscoreJS方法将源对象的属性浅层复制到目标对象。这里我们将所有父对象(静态)属性和传递给staticProp
对象(如果提供)的所有属性复制到新的扩展类。这可能是Backbone.extend例程最重要的功能:这是扩展类“继承”基类原型链的地方。例如,如果
AnimalClass.prototype.walk
是AnimalClass
的原型链中的一个方法,则_.create(parent.prototype, protoProps)
将使用此新类原型链中的walk
方法以及传入的所有protoProps
创建一个新类。本质上,这_extended prototype链',并将其作为原型分配给扩展类。这一行一开始很混乱,因为我们在上面的条件语句中看到扩展类已经被分配了一个构造函数。好吧,它确实被分配了,但是在最后一条语句中,当我们执行
_.create(...)
时,我们用基类的构造函数覆盖了扩展类的构造函数!现在我们重新分配它。正如注解所说,扩展类可以访问***静态属性 *
__super__
中的基类。这是一个方便的属性,可以从扩展类对象本身访问。在我们前面的例子中,如果CatClass
是从AnimalClass
扩展而来的,则以下为真:CatClass.__super__ === AnimalClass
.