💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 一图理解原型链 以下代码为例,看看用构造函数生成一个对象后,实例`f1`对象是如何与构造函数`Foo`、`Function`、`Object`串联起来的。 ```js function Foo() {} const f1 = new Foo(); ``` ![](https://img.kancloud.cn/fe/30/fe30a5f49204beaa8efc206a1df8e4c2_800x419.png) 注意:`__proto__`不是 JS 标准规范,`__proto__`是实例的属性(也就是我们所说的按原型查找),`prototype`是构造函数的属性,`constructor`是原型上的属性。 * `f1`对象是构造函数`Foo`的实例,所以`f1`有`__proto__`属性。 `f1.__proto__ === Foo.prototype` `f1.__proto__.constructor === Foo.prototype.constructor === Foo` * `Foo`和`Object`虽然是构造函数,但都是`Function`构造函数的实例,所以`Foo`、`Object`有`__proto__`属性。 `Foo.__proto__ === Object.__proto__ === Function.prototype` `Foo.__proto__.constructor === Object.__proto__.constructor === Function.prototype.constructor === Function` * `Foo.prototype`和`Function.prototype`对象是构造函数`Object`的实例,所以都有`__proto__`属性。 `Foo.prototype.__proto__ === Function.prototype.__proto__ === Object.prototype` `Foo.prototype.__proto__.constructor === Function.prototype.__proto__.constructor === Object.prototype.constructor === Object` # 特殊机制 * 特殊 1:`Object.prototype`按道理也是某构造函数的实例对象,应该是底层实现。 `Object.prototype` 是对象,但它不是通过 Object 函数创建的。`Object.prototype` 谁创建的,它是 v8 引擎(假设用的都是 chrome 浏览器)按照 ECMAScript 规范创造的一个对象。 `Object.prototype.__proto__ === null`链路到此结束 * 特殊 2:`Function`按道理也是某构造函数(指回了自己)的实例对象,应该是底层实现。 `Function.__proto__ === Function.prototype === Object.__proto__` `Function.__proto__.constructor === Function.prototype.constructor === Function`实现闭合。 # 结论 1. 先有 `Object.prototype`(原型链顶端),`Function.prototype` 继承 `Object.prototype` 而产生,最后,`Function` 和 `Object` 和其它构造函数继承 `Function.prototype` 而产生。 2. `Function.__proto__ === Function.prototype`导致`Function.constructor === Function`,即:**Function 是它自己的构造函数** 引用自[http://www.mollypages.org/tutorials/js.mp](http://www.mollypages.org/tutorials/js.mp) > https://github.com/jawil/blog/issues/13 > [原文链接](https://hub.fastgit.org/Godiswill/blog/issues/10) > https://hub.fastgit.org/Godiswill/blog