2015-06-08 7 views
0

Я пытаюсь создать простую систему обратного вызова, которая срабатывает при нажатии кнопки. Вместо обратного вызова, являющегося заводской функцией, это прототип другого объекта. Я заработал, но я этого не понимаю. Зачем мне нужно использовать .bind (object), чтобы заставить объект запускать его метод? Первоначально я не пытался связывать, а затем связывал (это), которые оба не удались.Вызов метода прототипа объекта из метода другого объекта

function Bar() {} 

Bar.prototype = { 
    getStuff: function() { 
     return "Hello"; 
    }, 

    setStuff: function() { 
     console.log(this.getStuff()); 
    } 
} 

function Foo() { 
    this.afterSubmit = null; 
    var self = this; 
    $('button').click(function() { 
     self.submit() 
    }); 
    return this; 
} 

Foo.prototype = { 
    submit: function() { 
     if (this.afterSubmit !== null) { 
      this.afterSubmit(); 
     } 
     $('#msg').append('clicked '); 
     return this; 
    }, 

    setAfterSubmit: function (callback) { 
     this.afterSubmit = callback; 
     return this; 
    } 
} 

var bar = new Bar(); 
var foo = new Foo().setAfterSubmit(bar.setStuff.bind(bar)); 
// Why do I need to bind bar ? 

Пожалуйста, обратите внимание на мою скрипку https://jsfiddle.net/j5qfuzna/

+1

Когда метод уволен, он запускается в контексте его invoker, если неявно объявлено иначе ('.call',' .apply', '.bind'). –

ответ

1
this.afterSubmit(); 

Это устанавливает контекст для экземпляра Foo. Привязка к экземпляру Bar предотвращает это.