Я просто использую прототипный JavaScript, и мне трудно понять, как сохранить ссылку this
на главный объект изнутри функции прототипа при изменении области действия. Позвольте мне проиллюстрировать, что я имею в виду (я использую jQuery здесь):
MyClass = function() {
this.element = $('#element');
this.myValue = 'something';
// some more code
}
MyClass.prototype.myfunc = function() {
// at this point, "this" refers to the instance of MyClass
this.element.click(function() {
// at this point, "this" refers to the DOM element
// but what if I want to access the original "this.myValue"?
});
}
new MyClass();
Я знаю, что я могу сохранить ссылку на основной объект, выполнив это в начале myfunc
:
var myThis = this;
а затем используя myThis.myValue
для доступа к основному объекту. Но что происходит, когда у меня есть целая группа прототипов на MyClass
? Должен ли я сохранить ссылку на this
в начале каждого из них? Похоже, что должен быть более чистый путь. А как насчет ситуации вроде этого:
MyClass = function() {
this.elements $('.elements');
this.myValue = 'something';
this.elements.each(this.doSomething);
}
MyClass.prototype.doSomething = function() {
// operate on the element
}
new MyClass();
В этом случае я не могу создать ссылку на основной объект с помощью var myThis = this;
, потому что даже исходное значение this
в контексте doSomething
является объектом jQuery
, а не MyClass
объект.
Мне предложили использовать глобальную переменную для ссылки на исходный this
, но для меня это кажется очень плохой идеей. Я не хочу загрязнять глобальное пространство имен, и похоже, что это мешает мне создавать два разных объекта MyClass
, не мешая друг другу.
Любые предложения? Есть ли чистый способ сделать то, что мне нужно? Или мой дизайн дизайна ошибочен?