从Chrome中的javascript控制台:
> function Person(name){this.name=name;}
undefined
此时,根据Javascript规范,Person.prototype应该是一个空对象。 我们分配一下:
> p=Person.prototype
> Person
请注意,>人是可点击的,它扩展为:
constructor: function Person(name){this.name=name;}
__proto__: Object
但是......它不是一个空的对象吗?什么是额外的东西? 如果你发出警报:
alert(p)
你得到[object Object]。为什么当您在Chrome控制台中输入时,为什么会出现>扩大的人?这不是一个空的对象吗?
谢谢!
答案 0 :(得分:10)
不,prototype
始终具有constructor
属性,该属性指向它是原型的函数。当然,它也继承自一个对象,即内部__proto__
属性。
它在ECMAScript 5 Section 13.2, Creating Function Objects中定义:
(...)
16。设 proto 是创建一个新对象的结果,因为
new Object()
Object
the standard built-in constructor with that name所在的表达式构建了一个新对象。17。使用参数
"constructor"
,Property Descriptor {[[Value]]: F ,{[[]调用 proto 的[[DefineOwnProperty]]内部方法Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true},false。18。使用参数
"prototype"
,Property Descriptor {[[Value]]: proto ,{[[]调用 F 的[[DefineOwnProperty]]内部方法Writable]]:true,[[Enumerable]]:false,[[Configurable]]:false},false。(...)
这意味着:
创建一个名为 proto 的新空对象(16)。在该对象上定义属性constructor
并将值设置为 F (函数本身)(17)。然后在函数 F 上定义属性prototype
,并将其值设置为 proto 。
如果alert
是一个对象,则该对象将转换为字符串。除非重写“特殊”[object Object]
方法,否则默认行为是将对象转换为toString
字符串。
Chrome控制台列出了这些属性,因为它用于调试,因此您需要信息。 [object Object]
信息量不大。
FWIW,一个空对象看起来像这样:
您还可以在此处查看内部__proto__
媒体资源。空对象始终继承了一些默认属性,但它没有拥有属性。
答案 1 :(得分:0)
Chrome的控制台是一款开发者工具。它旨在显示深入的信息。在这种情况下,您将查看刚刚定义的类的预定义属性。
答案 2 :(得分:0)
这些是从Object类继承的方法和属性。