2013-09-07 2 views
0

Я создаю обертку, макет образца следующимВызывающие методы прототипа изнутри обратного вызова

var car = function() { 
} 

car.prototype.method1 = function() { 
    this.method2(); 
} 

car.protoptype.method2 = function(callback) { 
    var request = foo() //call to async method 

    request.onsucces = function() { 
     this.method3(); 
    }); 
} 

car.protoptype.method3 = function(callback) { 
    this.method4(); //not found 
} 

car.protoptype.method4 = function(callback) { 
    //code 
} 

// абоненте

var vehicle = new Car; 
vehicle.method1() 

Моя проблема заключается в том, что метод 4 не называется. Как его вложенный в обратный вызов onsuccess, будет ли это «не» областью для объекта в методе 4?

+1

'request.onsucces {this.method3()}' <- это недопустимый синтаксис –

+0

спасибо, исправились. – user2648914

+0

@Brian: Не устанавливайте такой синтаксис людей. Вы не знаете, как должен выглядеть правильный синтаксис. – user2736012

ответ

2

Я думаю, что вы хотите fn.bind

request.onsuccess = this.method3.bind(this); 

Таким образом, вы можете избежать любой var that = this; контекста взламывает

Примечания это зависит от ECMAScript 5 и не будет работать в браузерах динозавров. Если вам нужно поддерживать доисторическое программное обеспечение, посмотрите на es5-shim

+0

Ваше назначение onsuccess не соответствует сигнатуре OPs. – dc5

+0

@ dc5 Я предлагаю вам ознакомиться с привязкой функций. – naomik

+0

@ dc5: Другой пользователь временно изменил вопрос, чтобы сделать 'onsuccess' похожим на вызов функции вместо назначения. – user2736012

1

Возможно, это связано с context в рамках обратного вызова. Вы можете сохранить ссылку на this, как self:

car.protoptype.method2 = function(callback) { 
    var self = this; 
    var request = foo() //call to async method 

    request.onsucces(function() { 
     self.method3() 
    }); 
} 

Другие предположили, что вы используете Function.prototype.bind. Проблема с этим подходом заключается в том, что он не работает в старых браузерах (< = IE8). Вы всегда можете выбрать polyfill this behavior, если хотите.

1

Использование Function.prototype.bind()

request.onsuccess = this.method3.bind(this); 

Это создает новую функцию со значением, переданным в качестве первого аргумента, связанного со значением this.

Смежные вопросы