オブザーバーの JavaScript ネイティブ実装の例 pattern_javascript スキル

韦小宝
リリース: 2017-12-15 13:27:31
オリジナル
1141 人が閲覧しました

以下のエディターは、オブザーバー パターンの JavaScript ネイティブ実装の例、JavaScript ソース コードを共有します。JavaScript に興味がある場合は、エディターに従ってご覧ください。

オブザーバー パターンは、パブリッシュ/サブスクライブ パターンとも呼ばれます。 1 対多の関係を作成し、複数のオブザーバー オブジェクトが特定のトピック オブジェクトを同時に監視できるようにし、このトピック オブジェクトのステータスが変化すると、すべての監視オブジェクトに通知します。 トピックとオブザーバーの 2 種類のオブジェクトで構成されます。トピックはイベントの発行を担当し、オブザーバーはこれらのイベントをサブスクライブすることでサブジェクトを監視します。パブリッシャーとサブスクライバーは完全に分離されており、お互いの存在を知りません。カスタム イベントの名前を共有するだけです。

Nodejs では、このモードのネイティブ サポートは EventEmitter を通じて実装されます。

JavaScript のイベント リスニング メカニズムは、オブザーバー パターンとして理解できます。 onclick を通じてイベントをバインドし、インタラクティブな動作を通じてイベントをトリガーするか、イベントをアクティブにトリガーします。

以下は JS でカスタマイズされた PubSub です。次のコードを注意深く読むと、オブザーバー パターンを理解するのに役立ちます。

1. オブザーバークラスPubsubを定義します


/* Pubsub */
 function Pubsub(){
  //存放事件和对应的处理方法
 this.handles = {};
 }
ログイン後にコピー


2.


//传入事件类型type和事件处理handle
 on: function (type, handle) {
  if(!this.handles[type]){
   this.handles[type] = [];
  }
  this.handles[type].push(handle);
 }
ログイン後にコピー

にイベントサブスクリプションを実装します

3. イベントリリースエミットを実装します


emit: function () {
  //通过传入参数获取事件类型
 var type = Array.prototype.shift.call(arguments);
  if(!this.handles[type]){
   return false;
  }
 for (var i = 0; i < this.handles[type].length; i++) {
   var handle = this.handles[type][i];
   //执行事件
  handle.apply(this, arguments);
  }
 }
ログイン後にコピー


説明する必要があるのは、コード Array.prototype.shift.call(arguments) であり、arguments オブジェクトは関数の組み込みオブジェクトであり、実際のパラメーター グループを取得できます。メソッドを呼び出すときに渡されます。

shift メソッドは、配列の最初のパラメーター (型 type) を取り出します。

4. イベントの購読解除を実装します


off: function (type, handle) {
  handles = this.handles[type];
  if(handles){
   if(!handle){
    handles.length = 0;//清空数组
  }else{
    for (var i = 0; i < handles.length; i++) {
     var _handle = handles[i];
     if(_handle === handle){
      handles.splice(i,1);
     }
    }
   }
  }
 }
ログイン後にコピー


完全なコード:


/* Pubsub */
 function Pubsub(){
  //存放事件和对应的处理方法
 this.handles = {};
 }
 Pubsub.prototype={
  //传入事件类型type和事件处理handle
  on: function (type, handle) {
   if(!this.handles[type]){
    this.handles[type] = [];
   }
   this.handles[type].push(handle);
  },
  emit: function () {
   //通过传入参数获取事件类型
  var type = Array.prototype.shift.call(arguments);
   if(!this.handles[type]){
    return false;
   }
 for (var i = 0; i < this.handles[type].length; i++) {
    var handle = this.handles[type][i];
    //执行事件
   handle.apply(this, arguments);
   }
  },
  off: function (type, handle) {
   handles = this.handles[type];
   if(handles){
    if(!handle){
     handles.length = 0;//清空数组
   }else{
 for (var i = 0; i < handles.length; i++) {
      var _handle = handles[i];
      if(_handle === handle){
       handles.splice(i,1);
      }
     }
    }
   }
  }
 }
ログイン後にコピー


5. テスト


りー


上記のオブザーバー パターンの JavaScript ネイティブ実装の例は、エディターによって共有されたすべての内容です。参考にしていただければ幸いです。また、PHP 中国語 Web サイトを使用していただければ幸いです。

関連する推奨事項:

JavaScript オブザーバー パターンの定義と dom イベント インスタンスの詳細な説明

JavaScript オブザーバー パターンの定義、シーン インスタンス コードの詳細な説明

JavaScript の原理の分析オブザーバーパターン、関数

以上がオブザーバーの JavaScript ネイティブ実装の例 pattern_javascript スキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!