JavaScript «это» в другом контексте - PullRequest
2 голосов
/ 24 февраля 2012

Я пытаюсь создать объект JavaScript следующим образом.

var MyObject = function (parameters) {
    this.parameters = parameters;
    parameters.userFunction(this.MyObjectCallback);
}

MyObject.SOME_STATIC_VARIABLE = 21;

MyObject.prototype = {
    myObjectCallback: function() {
         console.log(this);
    }
}

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

new MyObject({userFunction: function(callback) {
   $.post(
        'http://localhost/~knyttl/source.php',
        {},
        callback,
        'json');,
}});

К сожалению, даже при правильном вызове callback 1009 * получает экземпляр JQuery объект, а не экземпляр MyObject, как мне хотелось бы.В заключение я не могу сохранить экземпляр MyObject.

Я даже не уверен, является ли это правильным способом создания объектов JavaScript.Буду благодарен за любое предложение.

Ответы [ 5 ]

5 голосов
/ 24 февраля 2012

Вы можете связать определенное значение this, используя .bind. Также я исправил заглавные буквы My.

parameters.userFunction(this.myObjectCallback.bind(this));

Когда вы вызываете функцию типа a.b(), то внутри b, this === a. Однако, если вы не напрямую вызываете ее, а только передаете функцию (например, a.b) и вызываете ее позже, эта привязка теряется.

.bind возвращает новую функцию, которая теперь получает результат jQuery ajax как this. Однако он игнорирует это и вызывает myObjectCallback с предопределенным (связанным) this.

.bind недоступно в старых браузерах, но есть доступные прокладки.

0 голосов
/ 24 февраля 2012

Использование этого в javascript может привести к путанице. При вызове функции ему присваивается значение того, что находится за точкой, например,

window.doSomething();

приведет к установке этого в окно, тогда как

myDOMElement.onClick();

приведет к установке для этого в myDOMElement.

В вашем случае все сводится к внутренней работе JQuery, поэтому взгляните на этот очень подробный набор объяснений , чтобы понять, как JQuery обрабатывает это .

0 голосов
/ 24 февраля 2012

Попробуйте это.

            var myObject = {

                obj1:function(paremeters){
                    this.Name = paremeters
                    return this},
                };

Я бы предложил вам прочитать, http://javascript.crockford.com/javascript.html

0 голосов
/ 24 февраля 2012

jQuery позволяет вам установить контекст вашего обратного вызова.

Вы находитесь в странной ситуации, когда ваш дизайн причиняет вам боль. Ваш MyObject не может быть передан в качестве контекста, потому что он создается одновременно.

new MyObject({userFunction: function(callback) {
   $.post(
        'http://localhost/~knyttl/source.php',
        {},
        callback,
        'json');,
}});

Так что вместо:

var myObj = new MyObejct();
myObj.setCallback({userFunction: function (callback) {
     $.ajax({
         context: myObj,
         url: 'http://localhost/what ever /',
         success: callback,
         dataType: 'json',
         data: {}
     }
});
0 голосов
/ 24 февраля 2012

См. apply () и call () .

parameters.userFunction.call(this, this.MyObjectCallback);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...