Sto lavorando tramite The Principles of Object-Oriented Javascript e sono confuso dall'uso di Zakas di una chiave con nome all'interno di un array (anziché all'interno di un oggetto). Vedere commento:Utilizzo di chiavi con nome in un array 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);
});
suo codice funziona bene (come avviene se si sostituisce l'array per un oggetto letterale), ma la mia comprensione è che si dovrebbe usare un oggetto se si vuole accedere ai contenuti in base al nome. Da array article on w3schools:
Molti linguaggi di programmazione supportano gli array con indici denominati.
Gli array con indici nominati sono chiamati array associativi (o hash).
JavaScript non non matrici di supporto con indici nominati.
In JavaScript, array utilizzare sempre gli indici numerati .
C'è una buona ragione per cui Zakas ha utilizzato un array come questo? Puoi spiegarlo per favore? In alternativa, è qualcosa che dovrei inviare a the errata?
Questo codice è corretto se 'type' è intero – hindmost
Questo codice funziona ancora perché sta impostando le proprietà sull'oggetto array, non sull'array effettivo. Controllare 'Object.getOwnPropertyNames (this._listeners)' e quindi 'Object.keys (this._listeners)'. 'this._listeners' dovrebbe essere un oggetto, non un array. – usandfriends
@hindmost: il codice è corretto (nel senso che è funzionale) anche se 'type' * non è * un intero (e sembra piuttosto probabile che non lo sia, molto più probabilmente una stringa come' "click" '). –