2015-05-04 13 views
5
var protoRabbit = {size: "small"}; 
var fastRabbit = Object.create(protoRabbit); 
console.log(Object.getPrototypeOf(fastRabbit)); 

上面的代码打印:为什么getPrototypeOf()在JavaScript中返回不正确的构造函数?

对象{大小: “小”}

不应该在该打印protoRabbit {大小: “小”}呢?我的理解中缺少什么?

+5

变量名称“protoRabbit”与对象本身无关。这只是一个恰好持有对象引用的变量。对象没有内部名称。 – Pointy

+0

做'console.log(protoRabbit)',它会打印相同的内容。 – Bergi

回答

6

在对象前面打印的名称是构造函数的名称。你的对象protoRabbit具有构造Object,因为你创建这个对象,使用对象文本:如果你想这个对象有不同的构造

var protoRabbit = {size: "small"}; 

,你必须使用你自己的构造函数:

function Constr() { 
    this.size = "small"; 
} 
var protoRabbit = new Constr(); 
var fastRabbit = Object.create(protoRabbit); 
console.log(Object.getPrototypeOf(fastRabbit)); //Constr { size: "small" } 

编辑

我有Demurgos'答案同意,的console.log(obj);结果取决于浏览器的实现。所以它可能会不同于浏览器和浏览器,并且可能(显然)在一个浏览器中有时甚至会发生变化(link)。

+0

我使用Mac 10.10在chrome(版本42.0.2311.135(64位))上运行此代码段,并且我得到了以下输出。对象{size:“小”} – Harish

+0

@Harish这很有趣。说实话,我不知道这里发生了什么,因为如果你在创建之后直接记录protoRabbit,输出就如预期的那样。它只在执行Object.create后才会改变。我为这个主题打开了一个[后续问题](http://jsfiddle.net/L5eahaLf/)。我还认为,我必须赞同'Demurgos'的说法,即输出取决于实现,并且因浏览器而异。 – basilikum

1

显示在控制台中的名称不是标准的。每个浏览器都要在打印对象时在其控制台中提供最佳的上下文。事实是,对象包含正确的属性,这就是我们真正需要的。

相关问题