Значение `this` в шаблоне метода шаблона JS

Почему отмеченная строка не может найти protectedACMember?

var Module = (function (ns) {

    function AbstractClass() {
        this.protectedACMember = "abstract";

        this.abstractPublicACMethod = function (input) {
            this.methodToImplement();                   
        }
    }

    ConcreteClass.prototype = new AbstractClass();
    function ConcreteClass(){
        var privateCCMember = "private CC";

        var privateCCMethod = function(){
            alert(this.protectedACMember); // cant find protectedACMember
        }

        this.methodToImplement = function(){ 
            privateCCMethod();
            console.log('Implemented method '); 
        }

    }

    ns.ConcreteClass = ConcreteClass;   

    return ns;

})(Module || {});

//somewhere later
var cc = new Module.ConcreteClass();
cc.abstractPublicACMethod();

Есть ли хорошие модели для моделирования частных, защищенных и публичных членов? Статический / нестатичный, а?

3 ответа

Решение

Вы должны изменить эту часть кода следующим образом:

    var self = this;
    var privateCCMethod = function(){
        alert(self.protectedACMember); // this -> self
    }

Таким образом, вы получите ссылку в закрытии.

Причина в том, что "this" является зарезервированным словом, и его значение устанавливается интерпретатором. Ваш privateCCMethod является анонимной функцией, а не свойством объекта, поэтому, если вы вызываете его просто с помощью синтаксиса privateCCMethod(), это будет нулевым. Если вы хотите, чтобы "this" было связано с чем-то конкретным, вы всегда можете использовать синтаксис.call, например:

privateCCMethod.call(this)

Не удается найти protectedACMember потому что this Ключевое слово означает изменения при вводе функции privateCCMethod, Обычной практикой является хранение внешнего this для использования внутри функций:

function ConcreteClass(){
    var privateCCMember = "private CC";

    // store the outer this
    var that = this;
    var privateCCMethod = function(){
        alert(that.protectedACMember);
    }
    ...

Остальные ваши вопросы довольно загружены и, вероятно, должны быть опубликованы в виде отдельного вопроса.

Еще один способ обеспечить this означает, что вы хотите использовать bind, Привязка позволяет вам гарантировать, что функция вызывается с определенным значением this,

Большинство новых браузеров поддерживают его (даже IE9!), И для тех, кто этого не делает, есть обходной путь.

Bind - документация MDN

Другие вопросы по тегам