2013-04-25 5 views
1

Из библиотеки Закрытие Google:В чем преимущество использования goog.inherits временного конструктора?

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

ответ

3

Первый фрагмент не называя parentCtor - это не инстанцированием объекта с вызовом конструктора на него, он просто наследует от parentCtor.prototype - на самом деле это обходное решение для Object.create (у очень старых браузеров его нет). См. Также Understanding Crockford's Object.create shim о том, как работает tempCtor и What is the reason [not] to use the 'new' keyword here? о нежелательности вызова родителя.

+0

Oh okay - так будет 'function (childCtor, parentCtor) {childCtor.prototype = Object.create (parentCtor); } 'трюк? – stinkycheeseman

+0

'Object.create (parentCtor.prototype)', но да. – Bergi

0

Вы можете использовать только «new parentCtor», если: (a) он будет работать без каких-либо параметров. (b) вы хотите, чтобы значения, установленные в «this» в parentCtor, были на вашем прототипе.

Вы видите, что люди делают это в простых случаях:

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

Но вы можете увидеть, как это может потерпеть неудачу, если Р:

var P = function(a) {a.x()} // throws if "a" is undefined. 

tempCtor избегает этого.

Смежные вопросы