goog.inherits使用临时构造函数的优点是什么?

时间:2013-04-25 20:55:34

标签: javascript google-closure

来自Google的Closure库:

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;
};

创建的临时构造函数有什么优势?

有没有理由代码看起来不像这样:

goog.inherits = function(childCtor, parentCtor) {
  /** @constructor */
  childCtor.superClass_ = parentCtor.prototype;
  childCtor.prototype = new parentCtor();
  /** @override */
  childCtor.prototype.constructor = childCtor;
};

2 个答案:

答案 0 :(得分:3)

第一个片段没有调用parentCtor - 它没有实例化一个对象,而是调用它上面的构造函数,它只是继承自parentCtor.prototype - 实际上它是Object.create的变通方法(非常古老的浏览器缺乏对它的支持)。另请参阅Understanding Crockford's Object.create shim tempCtor如何运作以及What is the reason [not] to use the 'new' keyword here?关于调用父母的不受欢迎程度。

答案 1 :(得分:0)

如果符合以下条件,您只能使用“new parentCtor”: (a)没有任何参数会成功 (b)您希望在原型上的parentCtor中的“this”值上设置值。

你看到人们在简单的情况下这样做:

var C = function() {};
C.prototype = new P();

但如果P是:

,你可以看到这会失败
var P = function(a) {a.x()}  // throws if "a" is undefined.

tempCtor避免这种情况。