节点:使用“类”语法的原型不显示预期的对象

时间:2016-09-09 17:44:07

标签: javascript prototype es6-class

在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原型中!

1 个答案:

答案 0 :(得分:3)

最有可能的问题是,在显示对象时,您的控制台不包含不可枚举的属性。

在第一种情况下,您可以按分配创建属性,因此它们是可枚举的:

Object.getOwnPropertyDescriptor(F.prototype, 'foo').enumerable; // true

但在第二种情况下,他们不是

Object.getOwnPropertyDescriptor(C.prototype, 'foo').enumerable; // false

这就是为什么你永远不应该相信控制台中的对象表示。如果要列出对象的所有属性,这可能会起作用:

Object.getOwnPropertyNames(C.prototype); // [ "constructor", "foo" ]

如果您的控制台无法正确显示数组,您可能希望加入该数组。