来自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;
};
答案 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避免这种情况。