为什么Object.prototype和Object.getOwnPropertyNames(Object.prototype)会返回不同的东西?

时间:2016-04-15 07:26:50

标签: javascript

Object.prototype
=> {}
   Object.getOwnPropertyNames(Object.prototype)
=> [ 'constructor',
  'toString',
  'toLocaleString',
  'valueOf',
  'hasOwnProperty',
  'isPrototypeOf',
  'propertyIsEnumerable',
  '__defineGetter__',
  '__lookupGetter__',
  '__defineSetter__',
  '__lookupSetter__',
  '__proto__' ]
   var x = {foo:2}
   x
=> { foo: 2 }
   Object.getOwnPropertyNames(x)
=> [ 'foo' ]

为什么Object.prototype为空,但调用Object.getOwnPropertyNames(Object.prototype)实际上不是?

1 个答案:

答案 0 :(得分:2)

这可能是因为Object.prototype的所有属性都是不可枚举的。它会因控制台而异,但显然您正在使用的控制台在您要求它显示Object.prototype时并未显示非可枚举的属性。相反,getOwnPropertyNames返回一个数组,其中包含您传入的对象的所有“自有”属性的名称,无论它们是否可枚举;然后你的控制台会显示该数组的内容。 (如果您使用Object.keys(Object.prototype)代替,则会得到一个空数组,因为Object.keys只会为您提供可枚举属性的名称。)

在您的x示例中,该对象具有可枚举的 foo属性。我怀疑你是否这样做了:

var x = {};
Object.defineProperty(x, "foo", {value: 2});
x

...在您的控制台中,您会看到{}Object.prototype类似,因为这会将foo定义为不可枚举的属性。