В javascript, как я могу вызвать один метод прототипа в другом методе прототипа?

Предположим, что у меня есть функция:

function test(){}
test.prototype.method01=function(){
 //do something
}
test.prototype.method02=function(){
 //how can I call the method01?
 //this.method01()...?
 //but the chrome through an error:
 //Uncaught TypeError: Object #<htmlimageelement> has no method 'method01'
}
</htmlimageelement>

Отредактировано: на самом деле метод01 выглядит следующим образом:

test.prototype.method02=function(){
 $('.cpy').resizable({
 }).draggable({
 start:function(e,ui){
 this.method01();
 }
 });
}
3 ответа

test.prototype.method02=function(){
 var testThing = this;
 $('.cpy').resizable({
 }).draggable({
 start:function(e,ui){
 testThing.method01();
 }
 });
}

Вы должны сохранить ссылку this в другой локальной переменной, чтобы функция обратного вызова могла использовать ее при вызове другого метода. Ссылка this привязана к каждому вызову функции, включая вызовы функций обратного вызова, подобные тем, которые вы используете в настройке ".draggable()". Если для функции "method02" будет выбрано значение this, которое будет отличаться от this.


Да, вы могли бы вручную кэшировать this в лексической области, как предлагают другие ответы в этом вопросе. Однако альтернативой, который я бы предложил, является создание связанного метода с использованием $.proxy или function.bind в качестве вашего обратного вызова.

Связанные методы всегда вызываются со стабильным this. Я считаю их более читаемыми, чем причудливо названные ссылки на this в более высоких областях


что о

test.prototype.method02=function(){
 this.method01.apply(this);
 // do some other stuff
}

licensed under cc by-sa 3.0 with attribution.