Chrome DevTools 控制台的内联(非扩展)对象表示目前不显示自己的属性和继承的原型属性之间的任何差异。
现在让我们把正在发生的事情分解成更小的步骤。
new foo()
创建一个内部proto
属性指向的新对象foo.prototype
。这意味着该对象可以访问foo.prototype
. 它被称为原型链。
现在,当您在对象中设置同名的属性时,它会以相同的名称“遮蔽”原型的属性,从而通过常规属性访问使后者无法访问(请参阅@loxxy 的答案,Object.getPrototypeOf(obj)
用于访问遮蔽的原型属性)。
向对象或其原型添加函数后,控制台允许您显示扩展对象表示,这确实不同于原型属性的自身属性。在下一个示例中,我q
向原型添加了一个方法来允许这种行为。从原型继承的属性显示在对象的proto
内部属性中:
如果您只想在构造函数的原型中拥有实例对象的数量,您可以使用:
var foo = function() {
Object.getPrototypeOf(this).p++;
}
foo.prototype.p = 0;
console.log(new foo()); //{p: 1}
console.log(new foo()); //{p: 2}
或者没有 ES5 依赖:
var foo = function() {
foo.prototype.p++;
}
foo.prototype.p = 0;
console.log(new foo()); //{p: 1}
console.log(new foo()); //{p: 2}