2016-09-13 14 views
2

プロトタイプパターンのプライベート関数をイベントの受信者にするにはどうすればよいですか?これまでは、私はメディエーターとしての公的な機能を使ってのみこれを行うことができます。これを行うより直接的な方法はありますか?プライベート関数をコールバックとしてバインドする方法

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' 
    }); 
}) 

--- EDIT ---

[OK]を、ので、私は今、私はこれを行うことができます参照してください。

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

...しかし、それはまだ不器用な感じ

+0

あなたは_really_それを行うことはできません。並べ替え関数は外部から見えるかどうかです。あなたはそれを "公開"してそれに固執するか、それを条件付きで公開しようとすることができます。どういうわけか。基本的に何らかの 'if(inTest)'を持って関数を公開することになります。私はあなたがプロキシでファンキーなことをすることができると思うが、それはそれが価値があるより複雑さとリスクを増やすと感じている。私は個人的に機能を公開したいが、他の人はそれに同意しないだろう。 – vlaz

答えて

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>

関連する問題