在这个涉及构造函数的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);

进一步阅读
  • Inheritance Patterns in JavaScript by Michael Bolin
  • An Examination of goog.base() by Michael Bolin
  • Closure: The Definitive Guide by Michael Bolin
  • JavaScript Patterns by Stoyan Stefanov(请参见第6章:“代码重用模式”,详分割析用于实现goog.inherits()的模式-经典模式#5--A临时构造函数)
  • 关于javascript - 为什么除了 `goog.base(this)`之外还需要 `goog.inherits()`?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11122608/

    10-11 03:04