函数的prototype
属性保存对象,当使用运算符创建时,该函数的所有实例都将从该对象继承new
。所有这些原型对象(通常)都有一个constructor
指向函数的属性——你有循环引用。因此,作为 anew test()
继承该属性,(new test).constructor === test
计算结果为true
。
您需要区分prototype
函数对象的属性和对象继承的原型对象——通常称为“内部[[prototype]]
属性”。
构造函数是一个函数,更不用说 a 了Function
,并且两者都有。因此它继承自Function.prototype
对象——该constructor
属性表示所有函数都是由Function
构造函数构造的。如果您的开发人员控制台会显示Function
对象的原型,您就可以看到它们。我认为设置中有一个选项。
因此,著名的“原型链”不是关于constructor
和/或prototype
属性,而是关于该对象继承自的原型对象:
function test() {} new test()
(a Function) (a test instance)
|| ||
|| ||
\/ \/
Function.prototype test.prototype
(a Function, by spec) (an Object)
|| ||
|| ||
\/ \/
Object.prototype Object.prototype
|| ||
|| ||
\/ \/
null null