在JS中,如果我使用构造函数来创建一个新对象,并且我访问原型对象,我就能看到原型所具有的任何属性。 (在更清晰的代码中):
function F() {
this.attr = 42;
}
F.prototype.foo = function() {
return 'life';
}
$> let f = new F();
undefined
$> f
F { attr: 42 }
$> Object.getPrototypeOf(f)
F { foo: [Function] }
就在这里,一切都很好。
现在,我将使用类语法来创建相同的场景
class C {
constructor() {
this.attr = 42;
}
foo() {
return 'life';
}
}
$> let c = new C()
undefined
$> c
C { attr: 42 }
$> Object.getPrototypeOf(o)
C {}
结果C {}
令我困惑。 我的foo
属性在哪里?它不在c
对象中,但似乎不在我的C
原型中!
答案 0 :(得分:3)
最有可能的问题是,在显示对象时,您的控制台不包含不可枚举的属性。
在第一种情况下,您可以按分配创建属性,因此它们是可枚举的:
Object.getOwnPropertyDescriptor(F.prototype, 'foo').enumerable; // true
但在第二种情况下,他们不是
Object.getOwnPropertyDescriptor(C.prototype, 'foo').enumerable; // false
这就是为什么你永远不应该相信控制台中的对象表示。如果要列出对象的所有属性,这可能会起作用:
Object.getOwnPropertyNames(C.prototype); // [ "constructor", "foo" ]
如果您的控制台无法正确显示数组,您可能希望加入该数组。