В javascript, как я могу вызвать один метод-прототип в другой метод-прототип? - PullRequest
10 голосов
/ 17 марта 2012

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

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'
}

Отредактировано: на самом деле method01 так:

test.prototype.method02=function(){
    $('.cpy').resizable({

    }).draggable({
        start:function(e,ui){
            this.method01();
        }
    });
}

Ответы [ 3 ]

13 голосов
/ 17 марта 2012
test.prototype.method02=function(){
    var testThing = this;
    $('.cpy').resizable({

    }).draggable({
        start:function(e,ui){
            testThing.method01();
        }
    });
}

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

2 голосов
/ 17 марта 2012

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

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

0 голосов
/ 17 апреля 2014

как насчет

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