2013-05-20 31 views
6

Ví dụ, một sự Array datatype có một chức năng gọi là pop(), mà tôi giả sử được thêm vào sử dụng:Tại sao các thuộc tính kiểu dữ liệu gốc không được hiển thị trên các nguyên mẫu tương ứng của chúng?

Array.prototype.pop = function(){ /* ... */ }; 

Nhưng như xa như tôi biết, cách duy nhất để làm cho nó không đếm được là để làm một cái gì đó như này:

Object.defineProperty(Array.prototype, "pop", { enumerable: false }); 

Không được tất cả trình duyệt hỗ trợ.

Array.prototype.doSomething= function(){ }; 
var arr = []; 

console.log(arr); // [doSomething: function] 

Vậy tại sao doSomething hiển thị ở đây, trong khi pop() thì không? Cả hai đều không được thêm vào nguyên mẫu?

+0

Mảng được ghi lại bằng cách sử dụng các mảng chữ: '[elem, elem]'. Làm thế nào bạn mong đợi các thuộc tính tùy chỉnh để phù hợp ở đây? '{0: elem, 1: elem, length: 2, pop: ...}'? –

+0

@ alex23 Trong ví dụ này, các công cụ dành cho nhà phát triển Chrome. Nhưng thường là con đom đóm. Tôi tin nó cũng xuất hiện ở đó. – Johan

+0

@RobW Vâng, nếu bạn nhìn ở đây: http: // jsfiddle.net/6BAJx/1/trong Chrome, bạn sẽ nhận được '[1, 2, 3, doSomething: function]'. Câu hỏi của tôi là tại sao chỉ có các thuộc tính tùy chỉnh của tôi "phù hợp" trong khi bản địa là vô hình. – Johan

Trả lời

4

MDN nói:

A cho ... trong vòng lặp không lặp đối với tài sản không đếm được. Các đối tượng được tạo từ các hàm dựng sẵn như Array và Object đã thừa hưởng các thuộc tính không thể đếm được từ Object.prototype và String.prototype không được liệt kê, chẳng hạn như phương thức indexOf của String hoặc phương thức toString của đối tượng. Vòng lặp sẽ lặp qua tất cả các thuộc tính enumerable của đối tượng chính nó và những đối tượng kế thừa từ nguyên mẫu của hàm tạo (các thuộc tính gần với đối tượng trong các thuộc tính nguyên mẫu ghi đè chuỗi nguyên mẫu).

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/for...in

gì được đăng nhập được cho là xuất phát từ một sự lặp lại for..in.., hoặc tương đương.

Khái niệm về các thuộc tính không thể đếm được trước ngày tính năng của việc xác định tính khả dụng của thuộc tính ngay trong Javascript.

MDN nói:

ECMAScript 3 có một thuộc tính nội bộ gọi DontEnum. Thuộc tính này được gắn vào các thuộc tính nhất định theo mặc định (§8.6.1).

Thuộc tính DontEnum bên trong xác định những gì không được liệt kê bởi một liệt kê (-12.6.4). propertyIsEnumerable thử nghiệm

https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute

ECMAScript 3 đặc tả định nghĩa rất nhiều tài sản với một thuộc tính DontEnum. http://bclary.com/2004/11/07/

Điều này thực sự không giải quyết được toàn bộ câu đố, vì ví dụ Array.prototype.pop không được liệt kê rõ ràng là có thuộc tính DontEnum, chỉ Array.prototype chính nó được liệt kê như vậy. Có thể thuộc tính DontEnum của hàm gốc được ngụ ý, nhưng tôi không thể tìm thấy tham chiếu cho hàm đó. Trích dẫn đầu tiên từ MDN làm ví dụ mô tả String.prototype.indexOf là không thể đếm được, trong khi điều này không được đề cập một cách rõ ràng trong thông số EcmaScript 3.