how to implement observer pattern in javascript?

前端 未结 9 1585
执笔经年
执笔经年 2021-01-30 07:29

Hi I\'m tyring to implement observer pattern in JavaScript:

My index.js:

$(document).ready(function () {
  var ironMan = new Movie();
           


        
9条回答
  •  爱一瞬间的悲伤
    2021-01-30 08:25

    Here's an implementation of the Observer pattern in JavaScript that provides an API very similar to Backbone Models. This implementation avoids use of "this" and "new", as suggested by Douglas Crockford.

    // The constructor function.
    function Model(){
    
      // An object containing callback functions.
      //  * Keys are property names
      //  * Values are arrays of callback functions
      var callbacks = {},
    
          // An object containing property values.
          //  * Keys are property names
          //  * Values are values set on the model
          values = {};
    
      // Return the public Model API,
      // using the revealing module pattern.
      return {
    
        // Gets a value from the model.
        get: function(key){
          return values[key];
        },
    
        // Sets a value on the model and
        // invokes callbacks added for the property,
        // passing the new value into the callback.
        set: function(key, value){
          values[key] = value;
          if(callbacks[key]){
            callbacks[key].forEach(function (callback) {
              callback(value);
            });
          }
        },
    
        // Adds a callback that will listen for changes
        // to the specified property.
        on: function(key, callbackToAdd){
          if(!callbacks[key]){
            callbacks[key] = [];
          }
          callbacks[key].push(callbackToAdd);
        },
    
        // Removes a callback that listening for changes
        // to the specified property.
        off: function(key, callbackToRemove){
          if(callbacks[key]){
            callbacks[key] = callbacks[key].filter(function (callback) {
              return callback !== callbackToRemove;
            });
          }
        }
      };
    }
    

    Here's some example code that uses Model:

    // Create a new model.
    var model = Model();
    
    // Create callbacks for X and Y properties.
    function listenX(x){
      // The new value is passed to the callback.
      console.log('x changed to ' + x);
    }
    
    function listenY(y){
      // The new value can be extracted from the model.
      console.log('y changed to ' + model.get('y'));
    }
    
    // Add callbacks as observers to the model.
    model.on('x', listenX);
    model.on('y', listenY);
    
    // Set values of X and Y.
    model.set('x', 30); // prints "x changed to 30"
    model.set('y', 40); // prints "y changed to 40"
    
    // Remove one listener.
    model.off('x', listenX);
    model.set('x', 360); // prints nothing
    model.set('y', 50); // prints "y changed to 40"
    

提交回复
热议问题