有没有办法遍历所有不可枚举属性?

3
当我编写JavaScript时,我经常会忘记一些内置对象的属性,不得不在mdn中查找它们,这很麻烦,因为它会减慢我的工作速度。与其参考文档,更方便的方法是创建一个对象,并使用for ... in结构和console.log()来检查它。但是对于非枚举属性,即使使用for ... in也无济于事。所以我的问题是,除了谷歌和文档,是否有其他方法来检查非枚举属性?
for(var i in Object){
    console.log([i,Object[i]]);
    // ["wtbind", function()]
}
console.log(Object.hasOwnProperty('create'));
// true
// Here Object.create is a non–enumerable property,
// and I have to look it up in documents if I forget it.

你用什么浏览器进行开发?你考虑过使用 console.dir() 而不是 console.log() 吗? - lanzz
非可枚举会禁用使用 Object.toSource() 的能力吗? - Steve
@lanzz Firefox和Firebug。我不知道有一个console.dir()。我尝试了console.dir(Object);//shows "prototype Object{}",但是那些非枚举属性,比如Object.create没有出现。 - OpenGG
@Tar 我认为非枚举描述符只是禁用某个属性的枚举,不会对禁用.toSource()产生任何影响。 - OpenGG
2个回答

4
这个链接看起来很有用,虽然它是一个相对较新的添加,而且似乎在Opera中不起作用。虽然它只列出了自身属性,但你可以一直向上爬原型链。

Object.getOwnPropertyNames(Object);//["prototype", "getPrototypeOf", "getOwnPropertyDescriptor", "keys", "defineProperty", "defineProperties", "create", "getOwnPropertyNames", "isExtensible", "preventExtensions", "freeze", "isFrozen", "seal", "isSealed", "length", "name", "arguments", "caller"],太好了!如果我想知道它们的类型,可以使用for循环来显示。 - OpenGG
由于我只会在开发环境中使用Object.getOwnPropertyNames,例如Firefox和NodeJS,所以Opera的问题对我来说没关系。再次感谢你。 - OpenGG
@Rufus 哦,好的 :) 反过来说,我主要使用 Opera,所以发现这一点并不开心 ;) - Imp

0

我知道这是老的,但你可以使用ES6的新功能和我认为ES2018来实现这个:

你可以使用for...of与迭代器的帮助if,如果你实现一个可迭代对象(因为对象不可迭代)

假设你有以下对象,其中一个可枚举属性和一个不可枚举属性

const obj = Object.defineProperties({}, {
  enumerableKey: {
    enumerable: true,
    value: 'hello'
  },
  nonEnumerableKey: {
    enumerable: false,
    value: 'world'
  }
});

您可以使用Symbol.iterator使其可迭代,并定义自己的实现。在下面的示例中,我正在生成每个键的值(但您可以生成任何您想要的内容)

obj[Symbol.iterator] = function* () {
  for(const key of Object.getOwnPropertyNames(this)) {
    yield this[key]
  }
}

接下来,您可以使用for...of循环遍历它:

// This will log:
// 'hello'
// 'world'
for(const val of obj) {
  console.log(val);
}

或者使用扩展运算符(因为扩展运算符使用迭代通过Symbol.iterator

[...obj] //[ 'hello', 'world' ]

如果您想了解更多关于它的信息,我建议您阅读以下内容:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接