DevTools堆快照中__proto__的含义是什么?

时间:2017-02-14 10:45:29

标签: javascript google-chrome-devtools v8

我使用以下代码创建了一个A对象:

function A(){
    this.one = "one"
    this.two = "two"
    this[0] = "numeric index"
}
var objs = [];
for (var i=0; i<10;i++){
    // create 10 objects to get object size without slack/space for additional properties
    objs.push(new A())
}
objs.forEach(function(obj){
    obj.extraProperty = "extra"
})

正如预期的那样,DevTools堆快照显示大小为40字节:

  • 两个属性onetwo
  • 的2 * 8字节
  • extra properties
  • 的8个字节
  • elements(编号属性)的8个字节
  • 隐藏类的8个字节

基于此explanation of V8 object representation

但是,堆快照还会将__proto__列为属性,但我认为它不会向对象的大小添加任何内容。

它也可以作为隐藏类/ Map的一部分进行访问,因此不需要存储对它的附加引用。

为方便起见,是否显示了__proto__属性?它是如何被使用的?

1 个答案:

答案 0 :(得分:2)

它具有与其已有的相同含义。实例有__proto__,类有prototype

function User(name){
    this.name = name
 }; 

var vinoth = new User("v");

vinoth.__proto__ == User.prototype //true

我们有new User(),然后vinoth instanceof User is true__proto__查找有助于查找原型层次结构,该原型层次结构将指向User.prototype,这将进一步指向Object,因为所有内容都是对象实例。进一步的Heirarchy导致最终为空。

__proto__只是chrome dev工具提供的参考。