我正在研究面向对象的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);
});
Run Code Online (Sandbox Code Playgroud)
他的代码工作正常(如果你用数组替换对象文字就行了),但我的理解是如果你想按名称访问内容,你应该使用一个对象.来自w3schools的数组文章:
许多编程语言支持具有命名索引的数组.
具有命名索引的数组称为关联数组(或哈希).
JavaScript并没有支持数组名为索引.
在JavaScript中,数组始终使用编号索引.
Zakas是否有充分的理由使用这样的阵列?你能解释一下吗?或者,这是我应该提交给勘误的内容吗?
我能看到的唯一原因是:让人困惑.JavaScript并没有强制执行任何东西,因为一切都是对象,你可以做任何你想要的事情.这家伙正在使用数组存储命名属性,但他很可能已经使用了函数或其他任何东西!
编辑:几乎所有东西都是一个对象(有人可能会试图设置一个属性undefined,因为JavaScript中最常见的错误之一是TypeError : undefined is not an object.叹息 JavaScript,为什么你这样对我们?