JS系列第六弹:JS基础之原型链

一、了解原型链前基础知识

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值