Ключевое слово jQuery 'this' в пользовательских методах - PullRequest
0 голосов
/ 17 ноября 2010

Во многих случаях я видел величие того, как jQuery изменяет ключевое слово this, чтобы дать объекту, который, как вы ожидаете, будет там на самом деле. Отлично ....

Однако, как вы справляетесь с ситуацией, когда у вас есть пользовательские объекты, которые имеют пользовательские методы, которые ссылаются на это ключевое слово, но называются через jQuery.

Например:

var myCustomObject = {

    myCustomValue: 1,

    myCustomMethod: function () {
        switch (this.myCustomValue) {
            case ....
        }
    }

};

Если вызывается с помощью обратного вызова jQuery, «this» теперь является «контекстом» jQuery и, очевидно, возвращает неопределенное значение для myCustomValue.

Я заметил, что могу напрямую ссылаться на экземпляр, например

switch (myCustomObject.myCustomValue) {}

Но это кажется досадно многословным, и мне интересно, может ли это быть вызвано неожиданными побочными эффектами ...

Что является наилучшей практикой для таких сценариев?

Ответы [ 2 ]

6 голосов
/ 17 ноября 2010

Если это не обязательно должно быть публично:

var myCustomObject = new (function()
{
    var myCustomValue = 1;
    this.myCustomMethod = function () {
        switch (myCustomValue) {

        }
    }
})();

Если это так:

var myCustomObject = new (function()
{
    this.myCustomValue = 1;
    var self = this;
    this.myCustomMethod = function () {
        switch (self.myCustomValue) {

        }
    }
})();

self можно называть как угодно.

2 голосов
/ 17 ноября 2010

Вы можете сохранить тот же синтаксис, если бы у вас была такая функция:

function patchThis(obj) {
    function patchFunction(orig) {
        return function() {
            return orig.apply(obj, arguments);
        };
    }
    for(var i in obj) {
        if(obj.hasOwnProperty(i)&&typeof obj[i]=="function") {
            obj[i]=patchFunction(obj[i]);
        }
    }
}

Затем просто вызовите patchThis на myCustomObject.

Вы можете увидеть пример здесь .

...