我是JavaScript的新手。我正在阅读JavaScript的好部分。它说:
每个功能对象也使用原型属性
创建
所以我做了这样的事情:
function test() {
}
console.log(test.prototype);
使用Chrome的开发者工具,我发现输出如下:
我真的很担心这个输出。为什么constructor
的{{1}}属性再次与prototype
嵌套?为什么这会像链一样继续?我在哪里错过这个概念?
提前致谢。
答案 0 :(得分:10)
函数的prototype
属性包含使用new
运算符创建时该函数的所有实例将从其继承的对象。所有这些原型对象(通常)都有一个constructor
属性,指向函数 - 你有循环引用。因此,当new test()
继承该属性时,(new test).constructor === test
会计算为true
。
您需要区分函数对象的prototype
属性和对象继承的原型对象 - 通常称为“内部[[prototype]]
属性”。
构造函数是一个函数,不是说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
答案 1 :(得分:2)
这是一本非常好的书。
它涵盖了更多来自程序员观点的javascript,涵盖了所有面向对象的技术,其中的大多数内容都没有在javascript的任何其他书籍中涵盖。
关于原型。 JavaScript中的每个对象都包含一个隐藏的状态 - 对另一个对象(称为对象的原型)的引用。 JavaScript中的Prototype对象为我们提供了继承,它们也允许我们共享方法实现。原型也链。换句话说,由于原型对象只是一个对象,因此原型对象可以维护对另一个原型对象的引用。
Javascript中的原型是一个很复杂的部分,因为我在学习它的过程中经历过。
知道js中的原型如何工作,这是一个很棒的reference。