私はThe Principles of Object-Oriented Javascriptを使っていますが、Zakasがオブジェクト内ではなく配列内に名前付きキーを使用するのと混同しています。コメントを参照してください:JS配列の名前付きキーの使用
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での配列は常にの番号のインデックスを使用します。
Zakasがこのような配列を使用した理由はありますか?あなたはそれを説明してもらえますか?あるいは、これは私がthe errataに提出しなければならないものですか?
'type'があれば、このコードが正しい:同様にあなた自身の例では、接続されたすべてのイベント・データが削除されるだろう - 次の例では、JSONシリアライザは
foo.baz
で非数値アレイのプロパティを無視する方法を示します整数です – hindmostこのコードは、実際の配列ではなく、配列オブジェクトのプロパティを設定しているため、引き続き動作します。 'Object.getOwnPropertyNames(this._listeners)'と 'Object.keys(this._listeners)'を確認してください。 'this._listeners'は配列ではなくオブジェクトでなければなりません。 – usandfriends
@hindmost: 'type' *が整数でなくても、コードは正しいです(それは機能的です)。そして、' 'クリック ''のような文字列である可能性は非常に高いようです')。 –