Chrome的Javascript控制台:它根据对象输出了什么?

Mer*_*erc 3 javascript google-chrome

来自Chrome中的javascript控制台:

> function Person(name){this.name=name;}
undefined
Run Code Online (Sandbox Code Playgroud)

此时,根据Javascript规范,Person.prototype应该是一个空对象.我们分配它:

> p=Person.prototype
  > Person
Run Code Online (Sandbox Code Playgroud)

请注意,> Person是可点击的,它会扩展为:

constructor: function Person(name){this.name=name;}
__proto__: Object
Run Code Online (Sandbox Code Playgroud)

但是......它不是一个空的对象吗?什么是额外的东西?如果你发出警报:

alert(p)
Run Code Online (Sandbox Code Playgroud)

你得到[object Object].为什么,当您在Chrome控制台中键入它时,它会出现>人物扩展?这不是一个空的对象吗?

谢谢!

Fel*_*ing 10

不,prototype始终具有constructor指向功能的属性,它是原型.当然它也从一个对象继承,那就是内部__proto__属性.

它在ECMAScript 5第13.2节" 创建函数对象"中定义:

(......)

16.设是创建一个新对象作为将由表达来构建的结果new Object(),其中Object内置构造具有该名称的标准.

17. 使用参数调用proto的[[DefineOwnProperty]]内部方法"constructor",属性描述符 {[[Value]]:F,{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:真假.

18. 使用参数调用F的[[DefineOwnProperty]]内部方法"prototype",属性描述符 {[[Value]]:proto,{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:假,和假.

(......)

这意味着:

创建一个名为proto(16)的新空对象.constructor在该对象上定义属性并将值设置为F(函数本身)(17).然后prototype在函数F上定义属性并将其值设置为proto.


如果alert是对象,则将对象转换为字符串.[object Object]除非toString重写"特殊" 方法,否则默认行为是将对象转换为字符串.

Chrome控制台列出了这些属性,因为它用于调试,因此您需要信息.[object Object]信息量不大.

FWIW,一个空对象看起来像这样:

空对象

您还可以在__proto__这里看到内部属性.空对象始终会继承某些默认属性,但它没有自己的属性.