2017-01-05 3 views
2

Что касается JS-новичка, я борюсь с JS-закрытием. Достаточно Google, хотя не могу понять, почему «это» недоступно в функции «store». Любая помощь будет оценена:JS: проблема закрытия Javascript в экземпляре прототипа

;(function (win) { 
var _af = function(storeObjectName, storeObjectValue) { 
    var self; 
    if (_af.prototype.instance) { 
     self = _af.prototype.instance; 
    } else { 
     self = Object.create(_af.prototype); 
     _af.prototype.instance = self; 
     self._init(); 
    } 
    if (arguments.length == 1) return self.fire(storeObjectName); 
    if (arguments.length == 2) self.store(storeObjectName, storeObjectValue); 
    return self; 
}; 

_af.prototype = { 
    afVariable: '_af', 
    afObject: {}, 

    _init : function(){ 
     this.afObject = this.get(self.afVariable); 
    }, 

    store : (storeObjectName, storeObjectValue)=>{ 
     // This throws the error, that this.get is not defined 
     this.get('_af'); 
    }, 

    get : storageObject=>{ 
     if (!storageObject) 
      this.afObject = '_af'; 
     else 
      this.afObject = '_someother' 
    } 
} 
win._af = _af; 
}(window)); 
+0

Как вы создаете '_af'? –

+0

Каков твой тест? Вы называете 'new _af', а затем запускаете' .store() '? Или вы просто пытаетесь '_af.store()'? – somethinghere

+0

Связанная [Функция стрелки против объявления/выражения функции: эквивалентны ли они/заменяемы?] (Http://stackoverflow.com/questions/34361379/arrow-function-vs-function-declaration-expressions-are-they-equivalent-exch) –

ответ

2

Это потому, что вы используете lambda expression ((...) => ...) вместо function() { ....

В JS this многое зависит от контекста. В вашем случае, так как прототип объекта, всякий раз, когда вы хотите использовать this для обозначения этого объекта, вы должны сделать это в функции, определенной в объекте, как:

store : function(storeObjectName, storeObjectValue) { 
    // This throws the error, that this.get is not defined 
    this.get('_af'); 
}, 

или (также правильный):

store(storeObjectName, storeObjectValue) { 
    // This throws the error, that this.get is not defined 
    this.get('_af'); 
}, 

Примечания вы делаете это правильно для _init, но не для store и get

при использовании синтаксиса лямбды, this будет ссылаться на текущее это, когда создается функция, поэтому она будет window.

Также избегайте использования get как функции/или любого другого имени, поскольку оно используется для определения геттеров.

+2

это правильно, единственное, что _ Когда вы используете синтаксис лямбда, это будет относиться к внешнему объекту (в данном случае функции (win)) _ - он будет ссылаться на текущий 'this', когда создается функция , поэтому это будет 'window', а не' function (win) ' –

+0

FWIW, официальным термином является« функция стрелки ». Кроме того, 'get' не является ключевым словом. –

+0

Спасибо, изменив выражение лямбда на обычную функцию. – SmileCold

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