Значение `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!), И для тех, кто этого не делает, есть обходной путь.