迭代Array.prototype

时间:2016-03-21 18:36:26

标签: javascript arrays

尝试为Array创建包装类,实现事件侦听器。以前,我使用了Array方法的静态列表,但现在我希望它是动态的,所以我试图遍历Array.prototype。在谷歌搜索了一下之后,我在这个网站上发现了一个说使用Object.getOwnPropertyNames的东西,它确实有用......有点儿。这是我的code。调试属性有效,但实际上没有。

(function(root, factory) {
  if (typeof define === 'function' && define.amd) {
    define([], factory);
  } else if (typeof module === 'object' && module.exports) {
    module.exports = factory();
  } else {
    root.Stack = factory();
  }
}(this || window || {}, function() {
  var Stack = function(stack) {
    if (!(this instanceof Stack)) {
      var self = Object.create(Stack.prototype);
      Stack.apply(self, arguments);
      return self;
    } else {
      if (stack instanceof Array) {
        if (arguments.length > 1) {
          Array.prototype.concat.apply(this.stack = [], arguments);
        } else {
          this.stack = stack;
        }
      } else if (Object.prototype.toString.call(stack) === '[object Object]') {
        this.stack = [];
        if (arguments.length > 1) {
          for (var i = 0; i < arguments.length; i++) {
            for (var j in arguments[i]) {
              if (arguments[i].hasOwnProperty(j)) {
                this.stack.push(arguments[i][j]);
              }
            }
          }
        } else {
          for (var key in stack) {
            if (stack.hasOwnProperty(j)) {
              this.stack.push(stack[key]);
            }
          }
        }
      } else {
        Array.prototype.push.apply(this.stack = [], arguments);
      }
      Array.prototype.push.apply(this, this.stack);
      this.length = this.stack.length;
    }
  };
  Stack.prototype = {
    events: {},
    on: function(event, callback) {
      this.events[event].push(callback.bind(this.stack));
      return this;
    },
    trigger: function(event, args) {
      this.events[event].forEach(function(callback) {
       callback(args);
      });
      return this;
    },
    off: function(event, callback) {
      this.events[event].splice(this.events[event].indexOf(callback), 1);
      return this;
    }
  };
  var proto = Object.getOwnPropertyNames(Array.prototype),
      method;
  for (method in proto) {
    method = proto[method];
    if (typeof Array.prototype[method] === 'function') {
      Stack.prototype.events[method] = [];
      Stack.prototype[method] = function() {
        return this.trigger(method, Array.prototype[method].apply(this.stack, arguments));
      }
    }
  }
  return Stack;
}));

method,在记录时,给出方法的名称,然后可以使用Array.prototype [method]访问函数本身,但以下示例不起作用并在我使用时使用列表。

Stack(1, 2, 3).on('push', function (length) {
  console.log('Length: ' + length + '.');
}).push(4, 5, 6);

我没有正确访问原型方法吗?我如何动态地运行它?

0 个答案:

没有答案