Почему some_func (…)! = Some_func.call (this,…) в конструкторе
Я всегда предполагал, чтоsome_function(...)
было точно так же, какsome_function.call(this, ...)
, Кажется, что это не относится к вызовам в конструкторах / контексте конструирования объекта:
function Class(members, parent) {
function Ctor(value) {
members.__init__.call(this, value);
return this;
};
Ctor.prototype = members;
Ctor.prototype.__proto__ = parent.prototype;
return Ctor;
}
var Base = Class({
__init__: function(value) {
this.value = value;
}
}, {});
var Child = Class({
__init__: function(value) {
// Base(value*2); ← WON'T WORK AS EXPECTED
Base.call(this, value*2); // works just fine
}
}, Base);
ВChild.__init__
необходимо использовать явный вызовBase.call(this, value)
, Если я не буду использовать это длинное выражение,this
назовет глобальный объект (window
в браузерах) в вызываемом базовом конструкторе. С"use strict"
будет выдана ошибка, так как в строгом режиме нет глобального объекта.
Может кто-нибудь, пожалуйста, объясните, почему я должен использоватьFunc.call(this, ...)
в этом примере?
(Протестировано с Node.js v0.6.12 и Opera 12.50.)