我正在使用The Principles of Object-Oriented 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);
});
他的代码工作正常(如果你用数组替换对象文字就行了),但我的理解是如果你想按名称访问内容,你应该使用一个对象。来自array article on w3schools:
许多编程语言都支持带有命名索引的数组 具有命名索引的数组称为关联数组(或哈希) JavaScript 不支持具有命名索引的数组 在JavaScript中,数组始终使用编号索引。
扎卡斯是否有充分理由使用这样的阵列?你能解释一下吗?或者,这是我应该提交给the errata的内容吗?
答案 0 :(得分:6)
我能看到的唯一原因是:让人困惑。 JavaScript并没有强制执行任何事情,因为一切都是对象,你可以做任何你想要的事情。这家伙正在使用数组来存储命名属性,但他很可能已经使用了函数或其他任何东西!
编辑:几乎一切都是一个对象(有人可能会尝试在undefined
上设置一个属性,因为JavaScript中最常见的一个错误是{ {1}}。叹息 JavaScript,你为什么要这样对我们?