goog.inherits()
建立从子构造函数到父构造函数的原型链。
/**
* Inherit the prototype methods from one constructor into another.
* @param {Function} childCtor Child class.
* @param {Function} parentCtor Parent class.
*/
goog.inherits = function(childCtor, parentCtor) {
/** @constructor */
function tempCtor() {};
tempCtor.prototype = parentCtor.prototype;
childCtor.superClass_ = parentCtor.prototype;
childCtor.prototype = new tempCtor();
/** @override */
childCtor.prototype.constructor = childCtor;
};
除了原型属性之外,构造函数可能有“自己的”属性(即添加到的特定于实例的属性this
)。由于goog.inherits()
不调用父构造函数,因此不会将自己的属性复制到子构造函数,并且不会执行父构造函数中的任何初始化代码。由于这些原因,标准模式是链接构造函数,如下例所示。
/**
* @param {string} name The parent's name.
* @constructor
*/
var Parent = function(name) {
/**
* @type {string}
* @private
*/
this.name_ = name;
}
/**
* @param {string} name The child's name.
* @constructor
* @extends {Parent}
*/
var Child = function(name) {
Parent.call(this, name);
}
goog.inherits(Child, Parent);
goog.base()
是用于调用父方法的辅助函数,因此您无需显式使用call()或apply()。
如果 [goog.base()] 从构造函数中调用,那么它会使用参数 1-N 调用超类构造函数。
如果这是从原型方法调用的,那么您必须将方法的名称作为第二个参数传递给该函数。如果不这样做,您将收到运行时错误。这使用参数 2-N 调用超类的方法。
此函数仅在您用于goog.inherits
表示类之间的继承关系时才有效。
在闭包代码中,通常使用链接构造函数goog.base()
而不是显式调用父构造函数。
/**
* @param {string} name The child's name.
* @constructor
* @extends {Parent}
*/
var Child = function(name) {
goog.base(this, name);
}
goog.inherits(Child, Parent);
延伸阅读