我有一个Javascript对象(它恰好是CloudKit库中的database
对象,但这并不重要)。根据{{3}}我已尝试以下内容列出此对象的键:
console.log(Object.keys(database))
console.log(Object.getOwnPropertyNames(database))
console.log(Reflect.ownKeys(database))
他们都记录了:
[ '_container', '_isPublic', '_partition' ]
(编辑:我也尝试使用for
/ in
循环,并且还记录了上述内容。)
但是,我知道这个对象也有performQuery
和saveRecords
方法,如果我专门记录它们,我可以看到它们:
console.log(database.performQuery)
// logs [Function: value]
console.log(database.saveRecords);
// logs [Function: value]
任何人都可以解释我如何获得此对象的所有列表,包括" secret"方法
答案 0 :(得分:2)
javascript中for/in
的一个臭名昭着的问题是它会获取继承的属性。 (因此.hasOwnProperty()
。)所以你可以做这样的事情来获得所有属性,继承与否:
function(target) {
var results = [];
for(var key in target) {
results.push(key);
}
return results;
}
我从你的问题中学到了很多东西。谢谢你。
这是我们想出的代码:
function scanProperties(obj){
var results = [];
while(obj) {
results = results.concat(Object.getOwnPropertyNames(obj));
obj = Object.getPrototypeOf(obj);
}
return results;
}
基本上走上继承链,抓住属性名称。可以通过在显示时删除重复的名称来改进。 (由于不同“类”的对象可以具有一些相同的属性,因此只有“最接近的”属性才会应用于我们开始的对象。)