2015-05-11 13 views
11

Có cách nào khác để tìm kiếm các đặc tính nguyên mẫu của đối tượng javascript hay không. Cho phép nói rằng tôi có như thế này.Liệt kê tất cả các thuộc tính nguyên mẫu của đối tượng Javascript

function proton() { 
    this.property1 = undefined; 
    this.property2 = undefined; 
}; 

proton.prototype = { 

    sample1 : function() { 
     return 'something'; 
    }, 

    sample2 : function() { 
     return 'something'; 
    } 

}; 

var my_object = new proton(); 

console.log(Object.keys(my_object)); 

lợi nhuận [ "property1", "property2"]

console.log(Object.getOwnPropertyNames(my_object)); 

lợi nhuận [ "property1", "property2"]

Nhưng những gì tôi muốn in là các thuộc tính prototype của đối tượng my_object.

[ 'sample1', 'sample2']

Để cho tôi để xem các thuộc tính prototype của đối tượng đó tôi cần phải console.log (object) và từ các công cụ phát triển i có thể tra cứu cho các thuộc tính của đối tượng đó.

Nhưng vì tôi đang sử dụng thư viện của bên thứ ba như phaser.js, react.js, create.js nên tôi không biết danh sách các thuộc tính mẫu của đối tượng được tạo từ thư viện này.

Có chức năng nguyên mẫu nào của Object để liệt kê tất cả các thuộc tính prototpye của đối tượng javascript không?

Trả lời

22

Không phải là phương pháp mẫu thử nghiệm, nhưng bạn có thể sử dụng Object.getPrototypeOf để đi qua chuỗi mẫu và sau đó lấy tên thuộc tính của từng đối tượng đó.

function logAllProperties(obj) { 
    if (obj == null) return; // recursive approach 
    console.log(Object.getOwnPropertyNames(obj)); 
    logAllProperties(Object.getPrototypeOf(obj)); 
} 
logAllProperties(my_object); 

Sử dụng này, bạn cũng có thể viết một hàm trả về cho bạn một mảng của tất cả các tên thuộc tính:

function props(obj) { 
    var p = []; 
    for (; obj != null; obj = Object.getPrototypeOf(obj)) { 
     var op = Object.getOwnPropertyNames(obj); 
     for (var i=0; i<op.length; i++) 
      if (p.indexOf(op[i]) == -1) 
       p.push(op[i]); 
    } 
    return p; 
} 
console.log(props(my_object)); // ["property1", "property2", "sample1", "sample2", "constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable" 
+1

Không phải là một guru JS ở đây, là có bất kỳ lý do tại sao truy cập '__proto__' và chuyển đổi nó thành một mảng là một ý tưởng tồi? ví dụ: 'var arr = Object.keys (my_object .__ proto __). map (function (key) {return my_object .__ proto __ [key]}); ' – Bassem

+1

@BassemDy Đối với một,' .__ proto__' giống như 'Object.getPrototypeOf' nhưng không được dùng nữa và không hoạt động trong một vài trường hợp cạnh. Ngoài ra, truy cập chỉ có một cấp của chuỗi nguyên mẫu có thể không giúp bạn có được tất cả các thuộc tính. Btw, OP dường như quan tâm đến tên thuộc tính không phải là giá trị, vì vậy bạn có thể bỏ qua '.map (…)' đó – Bergi

6
function prototypeProperties(obj) { 
    var result = []; 
    for (var prop in obj) { 
    if (!obj.hasOwnProperty(prop)) { 
     result.push(prop); 
    } 
    } 
    return result; 
} 

EDIT: Thao tác này sẽ lấy tất cả các thuộc tính được xác định trên bất kỳ tổ tiên nào. Nếu bạn muốn kiểm soát chi tiết hơn về những gì được xác định ở đâu, đề nghị của Bergi là tốt.

+1

Lưu ý rằng điều này sẽ chỉ in * đếm được thuộc tính *, trong khi trả lời chấp nhận sẽ in * tất cả * thuộc tính, có thể đếm được hay không. –

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