为什么函数原型被反复链接?

时间:2012-05-30 07:59:58

标签: javascript

我是JavaScript的新手。我正在阅读JavaScript的好部分。它说:

  

每个功能对象也使用原型属性

创建

所以我做了这样的事情:

function test() {
}

console.log(test.prototype);

使用Chrome的开发者工具,我发现输出如下:

enter image description here

我真的很担心这个输出。为什么constructor的{​​{1}}属性再次与prototype嵌套?为什么这会像一样继续?我在哪里错过这个概念?

提前致谢。

2 个答案:

答案 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