使用影响构造函数原型的对象方法



如果我创建一个新的"Foo"并在其上使用"addEventListener"方法,它会影响Foo的原型和Foo的所有新实例。

简单示例:http://jsfiddle.net/TYkF2/

function Foo() { }
Foo.prototype = {
  _evt: { open: [], close: [] },
  addEventListener: function(name, handler) {
    if (name in this._evt) {
      if (!(this._evt[name].indexOf(handler) > -1)) {
        this._evt[name][this._evt[name].length] = handler;
      }
    }
  },
  dispatchEvent: function(name, data) {
    data = data || {};
    if (name in this._evt) {
      for (var i = 0; i < this._evt[eventName].length; i++) {
        this._evt[name][i].call(this, data);
      }
    }
  }
};
var a = new Foo();
a.addEventListener("open", function() { alert("Hey!"); });
a.dispatchEvent("open");
var b = new Foo();
b.dispatchEvent("open"); // alerts Hey
alert(Foo.prototype._evt.open); //shows a's event handler

由于_evt: { open: [], close: [] }在原型内部,a._evtb._evt实际上是同一个对象。如果将_evt放入构造函数中,它将按预期工作:

function Foo() {
    this._evt = { open: [], close: [] };
}

最新更新