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.)

questionAnswers(1)

yourAnswerToTheQuestion