如何将私有函数绑定为回调

时间:2016-09-13 15:11:20

标签: javascript binding this

如何使原型模式的私有功能成为事件的接收者?到目前为止,我只能使用公共函数作为调解器。有更直接的方法吗?

https://plnkr.co/edit/9viJKqdczvfBqgxWG1qW?p=preview

var Person = (function() {

    function Person(name) {

        console.log('listening...', $('body')[0])
        this.name = name;
        $('body').on('test', this.onTest.bind(this));
}   

    Person.prototype.onTest = function(evt) {
        _talk.call(this, evt);
    }

    function _talk(evt) {
        console.log(this.name + ' says: ' + evt.payload)
    }

    return Person;
}());



$(function() {
    var p = new Person('Bob');
    $('body').trigger({
        type: 'test',
        payload: 'hello'
    });
})

---编辑---

好的,我现在看到我可以这样做了:

    $('body').on('test', function(evt) {
         _talk.call(this, evt);
    }.bind(this));

......但它仍然感觉笨拙

1 个答案:

答案 0 :(得分:2)

如果函数在对象的原型链中,无论如何都可以绑定它。

因此,没有什么可以阻止您将_talk函数绑定到Person的实例。

var Person = (function() {

    function Person(name) {

        console.log('listening...', $('body')[0])
        this.name = name;
        $('body').on('test', _talk.bind(this));
    }   

    Person.prototype.onTest = function(evt) {
        _talk.call(this, evt);
    }

    function _talk(evt) {
        console.log(this.name + ' says: ' + evt.payload)
    }

    return Person;
}());



$(function() {
    var p = new Person('Bob');
    $('body').trigger({
        type: 'test',
        payload: 'hello'
    });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>