2015-11-24 24 views
6

Tôi biết rằng bạn có thể lấy đối tượng mô tả thuộc tính của một thuộc tính nhất định 'prop' của một đối tượng nhất định obj với Object.getOwnPropertyDescriptor(obj,"prop");. Tôi đã tự hỏi: Các đối tượng này được lưu trữ ở đâu? Chúng được lưu trữ bên trong trong một đối tượng hoặc .... ở nơi khác? Tôi đã cố gắng tìm chúng trong các công cụ phát triển nhưng không có may mắn.Các đối tượng mô tả thuộc tính được lưu trữ ở đâu?

+2

Từ đọc sách của tôi của spec, gọi hàm này [kết thúc tại đây] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty), nơi nó xây dựng sự trở lại từ một loạt các 'khác nhau [ [thuộc tính nội bộ]] '. Các thuộc tính đó không _have_ để được tiếp xúc với thời gian chạy kết thúc, nhưng một số triển khai có thể làm cho chúng có sẵn, ví dụ như trong các công cụ dev. Milage của bạn có thể khác nhau ... –

+1

Chúng được lưu trữ ở bất kỳ nơi nào triển khai cụ thể nào để lưu trữ chúng hoặc có nhiều khả năng hơn, chúng được tạo khi được yêu cầu. –

Trả lời

1

Đối tượng mô tả thuộc tính không tồn tại trừ khi được yêu cầu một cách rõ ràng. Chúng được tạo ra đặc biệt khi bạn call Object.getOwnPropertyDescriptor. Vì vậy, mã sau:

var foo = {bar:'foo'} 
Object.getOwnPropertyDescriptor(foo, 'bar') === Object.getOwnPropertyDescriptor(foo, 'bar'); 

Luôn đánh giá sai.

Vì vậy, như chúng ta thấy (cả mã và đặc tả), đối tượng mô tả thuộc tính không được lưu trữ, nhưng được tạo theo yêu cầu.

Vậy đâu là writable, configurable, value, get, set ... atributtes được lưu trữ? Đặc điểm kỹ thuật không yêu cầu chúng được tiếp xúc với mã người dùng ... Here is C++ definition for V8 PropertyDescriptor class - có vẻ như mọi tài sản chiếm một byte.

Và nếu bạn muốn kiểm tra xem tài sản là có thể ghi, cấu hình hoặc tương tự, Firefox giao diện điều khiển cho phép bạn làm như vậy (nhưng chỉ khi tài sản là không ghi được hoặc có getter/setter): Firefox DevTools

+0

Nhưng không * đối tượng nào * - khi so sánh với một đối tượng khác - trả về false? Ví dụ '[1,2,3] == [1,2,3]' cũng là 'false' – Danield

+1

Đối tượng được so sánh bằng tham chiếu (" nó ** cùng một đối tượng ** "), không phải theo giá trị (" nó ** đối tượng ** giống hệt nhau "). Ví dụ. 'var a = {}, b = a; a === b; // true' – Ginden

+0

vâng, bạn nói đúng :) – Danield

Các vấn đề liên quan