这些(Javascript对象)方法来自哪里?

这些(Javascript对象)方法来自哪里?,javascript,Javascript,我有一个Javascript对象(它恰好是CloudKit库中的数据库对象,但这并不重要)。根据,我尝试了以下列出此对象的键: console.log(Object.keys(database)) console.log(Object.getOwnPropertyNames(database)) console.log(Reflect.ownKeys(database)) 他们都记录了: [ '_container', '_isPublic', '_partition' ] (编辑:我还尝试

我有一个Javascript对象(它恰好是CloudKit库中的
数据库
对象,但这并不重要)。根据,我尝试了以下列出此对象的键:

console.log(Object.keys(database))
console.log(Object.getOwnPropertyNames(database))
console.log(Reflect.ownKeys(database))
他们都记录了:

[ '_container', '_isPublic', '_partition' ]
编辑:我还尝试在
循环中为
/
使用一个
,它还记录了上述内容。)

但是,我知道这个对象也有
performQuery
saveRecords
方法,如果我专门记录它们,我可以看到它们:

console.log(database.performQuery)
// logs [Function: value]
console.log(database.saveRecords);
// logs [Function: value]

有人能解释一下我如何获得这个对象的所有密钥的列表,包括“secret”方法吗?

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;
}

基本上沿着继承链向上走,一路抓住财产名称。可以通过在出现重复名称时消除重复名称来改进。(因为不同“类”的对象可以有一些相同的属性,只有“最接近”的一个才适用于我们开始的对象。)

它们可能是不可枚举的,或者在原型链上更深层。但这是否意味着无法列出它们(即使使用反射和其他ES2015内容)?我认为不可能列出不可枚举的属性。其他的属性可以用
for in
循环或其他方法列出。如果JS中确实存在一类“无法列出”属性(即无法以任何其他方式列出的不可枚举属性),我当然会接受这一有效答案,特别是如果所述答案解释了这些属性是如何创建的以及为什么它们无法列出。可以创建或更改不可枚举的属性。
中的
for
/
循环列出了与
对象相同的三个键。
键也有。@MachineHost ES6 javascript也有。我不知道CloudKit是否使用它们,但它们可以创建通常不可列出的虚拟属性。有趣的是,但我不相信这里的情况是这样的(字符串
prox
甚至没有出现在CloudKit源代码中)。@MachineHost看起来像是隐藏的
\uuuuuuuuuuuuuuuuuuuuuuuuuu proto
属性中的函数(就像在
数据库中一样。这超出了我的专业知识范围,因为我不确定
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
实际上是如何工作的。这其实并不难(但通常解释得不好)。每个对象都有一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性,只有浏览器调试器才能看到,而不是代码。如果你做了
someObject.someKey
而对象没有它,它会检查它的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu一个新的对象,例如
const foo=new foo()
\uuu proto\uuuu
被设置为
foo
原型。这就是它的全部内容……除了这一点不能解释一些我尝试过的
\uu proto\uu
道具的东西。