如果我创建一个新的"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._evt
和b._evt
实际上是同一个对象。如果将_evt
放入构造函数中,它将按预期工作:
function Foo() {
this._evt = { open: [], close: [] };
}