Dlaczego some_func (…)! = Some_func.call (this,…) w konstruktorze
Zawsze to zakładałemsome_function(...)
było dokładnie takie samo jaksome_function.call(this, ...)
. Wydaje się, że nie jest to prawdą w przypadku wywołań w konstruktorze / kontekście konstrukcji obiektu:
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);
WChild.__init__
konieczne jest użycie wyraźnego połączenia doBase.call(this, value)
. Jeśli nie użyję tego długiego wyrażania,this
nazwałby obiekt globalny (window
w przeglądarkach) w wywoływanym konstruktorze bazowym. Z"use strict"
błąd zostanie zgłoszony, ponieważ nie ma obiektu globalnego w trybie ścisłym.
Czy ktoś może wyjaśnić, dlaczego muszę skorzystaćFunc.call(this, ...)
w tym przykładzie?
(Testowane z Node.js v0.6.12 i Opera 12.50.)