10

我对 JavaScript 很陌生。我正在阅读 JavaScript 的优秀部分。它说 :

每个函数对象也使用原型属性创建

所以我做了这样的事情:

function test() {
}

console.log(test.prototype);

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

在此处输入图像描述

我真的对这个输出感到困惑。为什么constructor'sprototype属性又嵌套了constructor呢?为什么这会像链条一样持续下去?我在哪里错过了这个概念?

提前致谢。

4

2 回答 2

13

函数的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
于 2012-05-30T08:10:45.717 回答
1

那是一本非常值得收藏的书。

从程序员的角度来看,它涵盖了更多的 javascript,涵盖了所有面向对象的技术,并且其中的大部分内容在任何其他关于 javascript 的书籍中都没有涵盖。

关于原型。JavaScript 中的每个对象都拥有一个隐藏的状态——对另一个被称为对象原型的对象的引用。JavaScript 中的原型对象为我们提供了继承,它们也允许我们共享方法实现。原型也连锁。换句话说,既然一个原型对象只是一个对象,那么一个原型对象可以维护对另一个原型对象的引用。

正如我在学习它时所经历的那样,Javascript 中的原型并不复杂。

这是了解 js 中原型如何工作的一个很好的参考。

于 2012-05-30T08:12:09.510 回答