Tôi đang làm việc thông qua The Principles of Object-Oriented Javascript và bị nhầm lẫn với việc Zakas sử dụng một khóa có tên trong một mảng (trái ngược với bên trong một đối tượng). Xem nhận xét:Sử dụng các khóa được đặt tên trong một mảng 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);
});
Mã của anh ấy hoạt động tốt (như nếu bạn thay mảng cho đối tượng), nhưng hiểu biết của bạn là bạn nên sử dụng đối tượng nếu bạn muốn truy cập nội dung theo tên. Từ số array article on w3schools:
Nhiều ngôn ngữ lập trình hỗ trợ các mảng có chỉ mục được đặt tên.
Mảng có chỉ mục được đặt tên được gọi là mảng kết hợp (hoặc băm).
JavaScript không không hỗ trợ các mảng có chỉ mục được đặt tên.
Trong JavaScript, mảng luôn sử dụng chỉ mục được đánh số.
Có lý do chính đáng để Zakas sử dụng một mảng như thế này không? Bạn có thể giải thích nó không? Ngoài ra, đây có phải là điều tôi nên gửi đến the errata?
Mã này là đúng nếu 'type' là số nguyên – hindmost
Mã này vẫn hoạt động vì nó đang thiết lập các thuộc tính trên đối tượng mảng, không phải trong mảng thực tế. Kiểm tra 'Object.getOwnPropertyNames (this._listeners)' và sau đó là 'Object.keys (this._listeners)'. 'this._listeners' phải là một đối tượng, không phải là một mảng. – usandfriends
@hindmost: Mã là chính xác (ở chỗ nó có chức năng) ngay cả khi 'type' * không phải là * một số nguyên (và có vẻ như nó sẽ không khả thi, nhiều khả năng là một chuỗi như' "click" '). –