我正在阅读JavaScript面向对象编程指南,但我对Zakas在数组中使用命名键(而不是在对象内)感到困惑。请看下面的注释:
function EventTarget() {}
EventTarget.prototype = {
constructor: EventTarget,
addListener: function(type, listener) {
if (!this.hasOwnProperty("_listeners")) {
// Why isn't this: `this._listeners = {};`
this._listeners = [];
}
if (typeof this._listeners[type] === "undefined") {
this._listeners[type] = [];
}
this._listeners[type].push(listener);
},
// more stuff
}
var target = new EventTarget();
target.addListener("message", function(event) {
console.log("Message is " + event.data);
});
他的代码很好用(如果你用对象字面量替换数组),但是我理解为想通过名称访问内容时应该使用对象。 在W3Schools上的数组文章中:
Zakas为什么要像这样使用数组?你能解释一下吗? 或者,我应该将此提交给勘误表吗?许多编程语言支持具有命名索引的数组。
具有命名索引的数组称为关联数组(或哈希)。
JavaScript不支持具有命名索引的数组。
在JavaScript中,数组始终使用数字索引。
Object.getOwnPropertyNames(this._listeners)
然后再看Object.keys(this._listeners)
。this._listeners
应该是一个对象,而不是一个数组。 - rgajrawala"length"
作为type
参数,否则什么也不会发生。如果传递了该参数,则会发生一些令人兴奋的事情。 - Raymond ChenMap
的原因。 - T.J. Crowder