2015-05-11 57 views
11

是否有任何其他方式來查找JavaScript對象的原型屬性。可以說我有這樣的。列出一個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)); 

返回[ 「property1」, 「property2」]

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

返回[ 「property1」, 「property2」]

但我想打印什麼的原型屬性對象my_object。

[「SAMPLE1」,「SAMPLE2」]

爲了讓我看到對象,我需要CONSOLE.LOG(對象)的原型屬性和開發工具,我可以看一下對的屬性那個對象。

但是因爲我使用第三方庫如phaser.js,react.js,create.js 所以我不知道這個庫創建的對象的原型屬性列表。

Object是否有任何原型函數列出JavaScript對象的所有prototpye屬性?

回答

22

不是原型方法,但可以使用Object.getPrototypeOf遍歷原型鏈,然後獲取每個對象的屬性名稱。

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

利用這一點,你也可以寫一個返回你所有的屬性名稱的數組的函數:

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

這裏不是JS大師,有沒有什麼理由爲什麼訪問'__proto__'並將其轉換爲數組是一個壞主意?例如:var arr = Object.keys(my_object .__ proto __)。map(function(key){return my_object .__ proto __ [key]}); ' – Bassem

+1

@BassemDy例如,'.__ proto__'就像'Object.getPrototypeOf'一樣,但不推薦使用,並且在幾個邊緣情況下不起作用。而且,只訪問原型鏈的一個級別可能不會讓你獲得所有的屬性。順便說一下,OP似乎對屬性名稱不感興趣,所以你可以省略'.map(...)' – Bergi

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

編輯:這將抓住所有在任何祖先上定義的屬性。如果你想更細緻地控制什麼是定義在哪裏,Bergi的建議是好的。

+1

注意,這將只打印*枚舉*性能,而接受的答案將打印*所有*屬性,可枚舉與否。 –

相關問題