ホームページ  >  記事  >  ウェブフロントエンド  >  オブザーバーの JavaScript ネイティブ実装の例 pattern_javascript スキル

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

韦小宝
韦小宝オリジナル
2017-12-15 13:27:311272ブラウズ

以下のエディターは、オブザーバー パターンの 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。