Chrome的对象显示?

时间:2013-11-02 18:19:18

标签: javascript

我可能不应该阅读chromes对象显示:

我有这段代码:

function Foo(){};
var g= new Foo();

另外 - (控制台代码):

>>Foo.prototype //  Foo {}

问题:

是否说它的类型是Foo的实例?或只是一个plain常规对象?

P.S。 - 我听说原型是常规物体。所以Foo{}中的Foo字让我觉得它是Foo 的实例

我为什么要问?

因为运行这个:

Foo.prototype.__proto__

显示Object {}而不是其实例构造函数原型,即:Foo.prototype ...

其他信息:

我的相关question(没有谈及Chrome显示对象的方式

1 个答案:

答案 0 :(得分:3)

Foo.prototype有一个属性constructor,其定义为Foo.prototype.constructor = Foo;这就是为什么控制台显示它

这是Foo.prototype具有constructor属性的结果。构造函数的每个原型都有constructor属性,该属性指向该函数,例如

Foo.prototype.constructor = Foo;

现在看来,为了确定对象是哪个构造函数,Chrome的控制台会查看对象的constructor属性,然后假设该对象是该函数的一个实例。登记/> 这几乎适用于所有情况,但不适用于原型对象,因为它们已明确设置constructor属性。

示例:

> function Foo() {}
undefined
> Foo.prototype.constructor = function xyz() {}
function xyz() {}
> Foo.prototype
xyz {}

另一个更简单的例子:

> var obj = {};
> obj
Object {}
> obj.constructor = function xyz() {};
function xyz() {}
> obj
xyz {}

正如您所看到的,控制台实际上只是查看对象的constructor属性(通常是继承的),然后打印分配给它的函数的函数名。

Foo.prototype.constructor只是在创建函数时分配的普通属性。 它的目的是Foo实际实例(使用new Foo创建)具有指向Foo的构造函数属性。 由于实例从原型继承了所有属性。

相关问题