我可能不应该阅读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显示对象的方式:
答案 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的构造函数属性。
由于实例从原型继承了所有属性。