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)
实际上不是?
答案 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
定义为不可枚举的属性。