JS之原型链

1. 引入

当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。
使用原型对象的好处是所有对象实例共享它的构造函数原型上的属性和方法,即继承
请添加图片描述

2. 完整原型链

请添加图片描述

3. 总结

  1. 对象身上会有原型__proto__这个属性(不建议使用)obj1.__proto__
  2. 函数都有原型对象prototype这个属性foo.prototype
  3. 函数也是对象foo、Function、Object是函数也是对象
  4. 实例对象的原型指向它的构造函数的原型对象foo.__proto__ === Function.prototype
  5. 原型对象都有constructor属性,指向构造函数本身;因为实例对象可以继承原型对象的属性,所以实例对象也拥有constructor属性,同样指向原型对象对应的构造函数Function.prototype.constructor === Functionfoo.constructor === Function
  6. 所有普通函数、构造函数、包括Function都是Function这个构造器的实例对象,因此它们的__proto__都指向Function的prototype。Object.__proto__ === Function.prototype Function.__proto__ === Function.prototype
  7. 所有原型对象(注意:不是对象捏,foo.__proto__ !== Object.prototype)都是Object构造函数的实例Function.prototype.__proto__ === Object.prototype,这里有个特殊之处在于,本来Object.prototype.__proto__ === Object.prototype,但是这样原型链将没有终点,因此Object.prototype.__proto__ === null,虽然null是原始类型,但符合这里的期望指向一个对象,却不存在的情况。
    请添加图片描述
为什么原型链的终点是null,而不是Object.prototype?

回顾原型链的定义:当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。

首先要明确一点,原型链是指对象的原型链,所以原型链上的所有节点都是对象,不能是字符串、数字、布尔值等原始类型。

另外,规范要求原型链必须是有限长度的(从任一节点出发,经过有限步骤后必须到达一个终点;显然也不能有环。)

因此,虽然null是原始类型,但符合这里的期望指向一个对象,却不存在的情况。

4. 关于new

  1. 申请一块内存,存放空对象。就是在栈内新建了一个obj,这个obj实际上是指的堆中对应的一个地址。
  2. 把实例化对象的隐式原型指向构造函数的显示原型。
  3. 利用call方法改变构造函数内部this指向,使this指向实例化的这个新对象。
  4. 如果执行结果有返回值并且是一个对象, 返回执行的结果, 否则, 返回新创建的对象。

5. 参考

constructor参考链接
原型链参考链接
new

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值