在这个涉及构造函数的Google Closure JavaScript代码片段中,为什么goog.base(this);
是必需的? Foo
是否已经通过goog.inherits(foo, goog.Disposable);
从Disposable继承了?
goog.provide('Foo');
/**
* @constructor
* @extends {goog.Disposable}
*/
Foo = function() {
goog.base(this);
}
goog.inherits(foo, goog.Disposable);
foo.prototype.doSomething = function(){
...
}
foo.prototype.disposeInternal = function(){
...
}
最佳答案
goog.inherits(childConstructor, parentConstructor)goog.inherits()
从子构造函数建立原型(prototype)链
到父构造函数。
/**
* 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;
};
除了原型(prototype)属性外,构造函数还可以具有“自己的”属性
(即,将特定于实例的属性添加到
this
)。由于goog.inherits()
不调用父构造函数,自己的属性不会复制到子构造函数和父中的任何初始化代码均未获得
被执行。由于这些原因,如以下示例中所示,标准模式为chain constructors。
/**
* @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(self, opt_methodName, var_args)
goog.base()
是用于调用父方法的帮助函数,以便您执行无需显式使用call()或apply()。
在闭包代码中,通常使用
goog.base()
链接构造函数而不是而不是显式调用父构造函数。
/**
* @param {string} name The child's name.
* @constructor
* @extends {Parent}
*/
var Child = function(name) {
goog.base(this, name);
}
goog.inherits(Child, Parent);
进一步阅读
goog.inherits()
的模式-经典模式#5--A临时构造函数)关于javascript - 为什么除了 `goog.base(this)`之外还需要 `goog.inherits()`?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11122608/