为什么在进行Javascript继承时创建临时构造函数?

时间:2014-04-23 08:50:14

标签: javascript prototype google-closure-library

为什么Google Closure Library中的goog.inherits如下所示:

goog.inherits = function(childCtor, parentCtor) {
  function tempCtor() {};
  tempCtor.prototype = parentCtor.prototype;
  childCtor.superClass_ = parentCtor.prototype;
  childCtor.prototype = new tempCtor();
  childCtor.prototype.constructor = childCtor;
};

而不是

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

tempCtor提供了哪些好处?

3 个答案:

答案 0 :(得分:5)

如果parentCtor有一些初始化代码,并且在最坏的情况下需要一些参数,那么代码可能会意外失败。这就是他们创建虚拟函数并从中继承的原因。

答案 1 :(得分:2)

关于对文字对象实例的引用的使用,它通过插入另一个函数实例将childCtor的原型与parentCtor原型的实际实例分离。

答案 2 :(得分:1)

thefourtheye 几乎回答了这个问题。第一个看起来效率更高,但如果在初始化期间只创建一个临时构造函数,则可以提高效率,而不是每次调用继承时都有一个:

goog.inherits = (function() {
  function tempCtor(){}
  return function(childCtor, parentCtor) {
    tempCtor.prototype = parentCtor.prototype;
    childCtor.superClass_ = parentCtor.prototype;
    childCtor.prototype = new tempCtor();
    childCtor.prototype.constructor = childCtor;
  };
}());

我怀疑差异是可衡量的,它只是给你一个温暖的内在光芒,以不时地节省几个CPU周期和字节的内存。