2012-11-09 42 views
6

Tôi đang gặp sự cố khi đang cố gắng tận dụng Object.defineProperty() trên đối tượng cơ sở. Tôi muốn kế thừa các thuộc tính từ đối tượng đó, sử dụng Object.create(), và sau đó xác định các thuộc tính khác trong đối tượng dẫn xuất (có thể được kế thừa từ đó). Tôi nên lưu ý rằng tôi đang nhắm mục tiêu điều này tại node.js.Tại sao console.log() không hiển thị các thuộc tính kế thừa từ Object.create?

Dưới đây là một ví dụ:

var Base = {}; 

Object.defineProperty(Base, 'prop1', { 
    enumerable:true, 
    get:function(){ return 'prop1 value';} 
}); 

Object.defineProperty(Base, 'prop2', { 
    enumerable:true, 
    value : 'prop 2 value' 
}); 

Object.defineProperty(Base, 'create', { 
    value:function(){ 
     return Object.create(Base); 
    } 
}); 

console.log(Base); 

var derived = Base.create(); 

Object.defineProperty(derived, 'prop3', { 
    enumerable:true, 
    value:'prop 3 value' 
}); 

console.log(derived); 

Những kết quả đầu ra như sau:

{ prop1: [Getter], prop2: 'prop 2 value' } 
{ prop3: 'prop 3 value' } 

Tôi nghĩ rằng console.log() sẽ liệt kê các thuộc tính kế thừa, cũng như các tài sản prop3 mà tôi định nghĩa trên đối tượng có nguồn gốc. Dường như nó không tìm kiếm hệ thống phân cấp nguyên mẫu cho các thuộc tính được định nghĩa theo cách này. Đúng không?

Tôi đã xem xét phương pháp toString() cho đối tượng của mình, nhưng có vẻ như console.log() không gọi điều đó.

  1. Làm cách nào để có được tất cả các thuộc tính được ghi lại mà không phải liệt kê thông qua chúng?
  2. Đây có phải là cách hợp lệ để triển khai kế thừa không?

EDIT:

  1. Có một chức năng trong thư viện Node.js' rằng sẽ thực hiện công việc và đăng nhập tài sản thừa kế?
+1

Đối với lười biếng: http://jsfiddle.net/ aDrjA/1/ –

+1

Đối với người mới bắt đầu, việc thực hiện 'console' là cụ thể cho từng trình duyệt. Bạn thực sự không thể dựa vào nó để hành xử theo cùng một cách, trình duyệt để trình duyệt, như mỗi nhà cung cấp đang làm một cái gì đó hoàn toàn khác với phi tiêu chuẩn. Khi bạn 'console.log (đối tượng);' trong Chrome dev-tools, bạn sẽ có một cây nút có thể mở rộng, có tất cả các phương thức và thuộc tính được sở hữu và cũng có chuỗi 'proto', có ngăn xếp kế thừa đầy đủ ... Mong đợi điều này trong mọi trình duyệt sẽ không xảy ra - các chương trình trong một số trình duyệt (WP7 IE9) sẽ sụp đổ nếu chúng thậm chí còn thấy 'window.console', vì chúng thậm chí không có triển khai. – Norguard

+1

*** "Tôi nên lưu ý rằng tôi đang nhắm mục tiêu điều này tại node.js." *** –

Trả lời

1

Firebug không đăng nhập tài sản thừa kế:

enter image description here

khi Chrome cung cấp cho bạn một cây-view bao gồm các tài sản thừa kế:

enter image description here

+0

@dwerner Chrome cung cấp chế độ xem dạng cây. 'console.log' là cài đặt cụ thể. Dường như Node.js đã quyết định chỉ ghi lại các thuộc tính riêng.Tất nhiên, điều đó không có nghĩa là đối tượng không kế thừa hai thuộc tính kia. –

4

bạn có thể sử dụng console.dir() nếu có sẵn

console.dir(derived) 

và nó sẽ hiển thị các tài sản thừa kế của đối tượng của bạn trên các đối tượng __proto__

Edit: doesnt dường như hiển thị trên nút dù

+0

Bạn cũng nên biết về console.dir() cảm ơn. Tôi chỉ không chắc chắn tôi muốn dựa vào '__proto__'. – dwerner

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