一、了解原型链前基础知识
1- 构造函数与普通函数
1- 当我们自定义一个函数时(箭头函数与生成器函数除外),这个函数就默认为一个构造函数【虽然它可以当做普通函数来使用】。
2- 我们即可以将这个函数直接调用, 也可以把它当成构造函数, 使用new方法构造出一个对象。这种特性叫做函数的二义性。
构造函数
约定:我们认为能new出对象来的函数,就叫构造函数
1. 构造函数通常约定首字母大写;函数对象约定首字母小写
2. 构造函数调用的时候需要在前面加个 new 操作符
并不是所有的内置函数都是构造函数。
也并不是所有的自定义函数都是构造函数。
prototype , proto,constructor
prototype 被称为显式原型【通常是我们自己写,自己设置的,主要针对构造函数】
__proto__ 被称为隐式原型【自己生成的,一般不会去更改,但是可以改,主要针对实例化对象】
constructor 被称为构造器【通常是prototype的反方向,主要针对构造函数的显式原型】
为显示原型里面设置的元素会在new后以隐式原型的形式出现。
原型与原型链玩的就是 prototype、 __proto__ 、 constructor 三者的关系
二、原型链规则
本章内容主要来自两方, 一方为: 猿人学安澜大佬, 另一方为 华为CSDN联盟
1. 每个构造函数都有 prototype 和 __proto__
2. 每一个对象/构造函数实例(这个也是对象)都有 __proto__ 【没有prototype】
3. 对象的 __proto__ 指向它本身构造函数的 prototype。这个称为 构造函数的原型对象
4. 调用对象/函数属性的时候,js 引擎会沿着 __proto__ 的顺序一直往上方查找,找到window.Object.prototype 为止,Object 为原生底层对象,到这里就停止了查找, 如果没有找到,就会报错或者返回 undefined
5. 而构造函数【也就是函数】的 __proto__ 指向 Function.prototype ƒ () { [native code] } 【空函数,我习惯把它叫构造器函数】/当然 Function也是一个函数,所以__proto__也指向空函数
6. 空函数的 __proto__ 指向 Object.prototype
6. __proto__是浏览器厂商实现的,W3C规范中并没有这个东西【所以不同浏览器的表现可能不同】
7. constructor 是 prototype 的反向。
8. 所有的构造函数的构造器, 都可以通过__proto__隐士原型追溯到同一个地方Function。Function的构造器是他本身
9. 实例化对象的构造器返回的本对象的构造函数
10. 对于很多原生构造函数【实例化对象】以 Number为例:
(1).__proto__ 指向 Number.prototype
但是 Number.prototype 也是一种 Number的实例化对象
所以 (1).__proto__.constructor == Number.prototype.constructor
但是注意: (1).__proto__.__proto__ 指向的是 Object.prototype
按照下图理解上面十条规则。如不理解,可以留言或加文章底部联系方式讲解。
1. Function.prototype == Object.__proto__
2. Function.prototype.constructor == Function
3. (1).__proto__.constructor == Number
4. Object.prototype == Object. __proto__
5. Function.__proto__ == Function.prototype
6. ('1').__proto__.constructor == String
7. Function.prototype == Function.constructor
8. Function.prototype == Function.constructor.prototype
9. Number.prototype.__proto__ == Object.prototype
10. var a={}; a.constructor.prototype == a.__proto__
1. Function.constructor == Object.constructor
2. (new Object) .__proto__ == Object.prototype
3. Set.__proto__ == Symbol.__proto__
4. Symbol.prototype.__proto__ == Object.prototype
5. (1).__proto__ == Number.prototype
6. Number.prototype.__proto__ == Object.prototype
7. Object.prototype.__proto__ == Function.prototype.__proto__
8. (1).__proto__.__proto__.constructor == Object
9. (1).__proto__.constructor.constructor == Object.constructor
欢迎加Q理解上图: Q979483611