2012-07-20 2 views
4

Я использую шаблон прототипа javascript, и я хочу добавить обратный вызов. Я пытаюсь что-то вроде:прототип javascript - добавление обратного вызова

http://jsfiddle.net/Qyhrb/2/

var Refinements = function() { }; 

    Refinements.prototype = function() { 
    Init = function() { 
     $('.btn').click(Callback); 
    }, 
    Callback = function(){ 
     alert('default function'); 
    }; 
    return { Init: Init, Callback : Callback }; 
    }(); 


    var refinements = new Refinements(); 
    refinements.Callback = function(){ alert('new method'); }; 
    refinements.Init(); 

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

+1

Какие проблемы вы с? Что вы ожидаете от этого кода, чего нет? –

+0

Я хочу, чтобы предупреждение («новый метод») запускалось на btn.click вместо предупреждения («функция по умолчанию»). – dhysong

+0

Я бы предпочел такую ​​структуру: http://jsfiddle.net/FUBxq/2/ - сохранить функцию обратного вызова частной и переопределить ее в 'init()' выглядит намного чище для меня. – Christoph

ответ

5
Init = function() { 
     var refinement = this; 
     $('.btn').click(refinement.Callback || Callback); 
    }, 

Fiddle

+0

он предпочел бы сохранить обратный вызов конфиденциальным и переопределить его в функции init: http://jsfiddle.net/FUBxq/2/ – Christoph

1
var Refinements = function() {}; 

Refinements.prototype = function() { 
    return { 
    init: function() { 
     $('.btn').click(this.callback); 
    }, 
    callback: function() { 
     alert('default function'); 
    } 
    } 
}(); 


var refinements = new Refinements(); 
refinements.callback = function() { 
    alert('new method'); 
}; 
refinements.init(); 
1

Когда я отделил из функций прототипа, и удаляют return { Init: Init, Callback : Callback }; часть кажется, что все работает нормально.

function Refinements() {} 

Refinements.prototype.Init = function() { 
    $('.btn').click(this.Callback); 
}; 

Refinements.prototype.Callback = function() { 
    alert('default function'); 
}; 


var refinements = new Refinements(); 
refinements.Callback = function(){ alert('new method'); }; 
refinements.Init();​ 

http://jsfiddle.net/Qyhrb/8/

0
Foobar = function() { 
    this.callBack = function() { 
     alert("Default method"); 
    }; 
} 

Foobar.prototype = { 
    Init: function() { 
     var self = this; 
     $(".btn").click(function() { 
      self.callBack.call(); 
     }); 
    } 
}; 

var foobar = new Foobar(); 
foobar.Init(); 
foobar.callBack = function() { 
    alert("Boo!"); 
}; 
Смежные вопросы