1

来自 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;
};
4

2 回答 2

3

第一个片段没有调用parentCtor- 它没有通过调用构造函数来实例化对象,它只是继承自parentCtor.prototype- 实际上它是一种解决方法Object.create(非常旧的浏览器缺乏对它的支持)。另请参阅了解 Crockford 的 Object.create 垫片以了解其tempCtor工作原理以及[不]在此处使用“新”关键字的原因是什么?关于打电话给父母的不可取之处。

于 2013-04-25T21:56:19.887 回答
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 避免了这种情况。

于 2013-04-25T23:44:43.733 回答