JavaScript之彻底理解原型与原型链

本文深入探讨JavaScript中的对象创建、函数本质、原型、构造函数、原型链等核心概念。通过实例解析了原型链的工作原理,以及如何利用原型链实现继承。同时,分析了Object.__proto__、Object.prototype以及它们之间的关系。通过对原型链的理解,可以更好地解答相关面试题。
摘要由CSDN通过智能技术生成

[](()2.基础铺垫


  1. JavaScript所有的对象本质上都是通过new 函数创建的,包括对象字面量的形式定义对象(相当于new Object()的语法糖)。

在这里插入图片描述

  1. 所有的函数本质上都是通过new Function创建的,包括ObjectArray

在这里插入图片描述

  1. 所有的函数都是对象。

[](()3. prototype


每个函数都有一个属性prototype,它就是原型,默认情况下它是一个普通Object对象,这个对象是调用该构造函数所创建的实例的原型。

在这里插入图片描述

[](()4. contructor属性


JavaScript同样存在由原型指向构造函数的属性:constructor,即Func.prototype.constructor --> Func

在这里插入图片描述

[](()5. __proto__


JavaScript中所有对象(除了null)都具有一个__proto__属性,该属性指向该对象的原型。

function User() {}

var u1 = new User();

// u1.proto -> User.prototype

console.log(u1.proto === User.prototype) // true

显而易见,实例的__proto__属性指向了构造函数的原型,那么多个实例的__proto__会指向同一个原型吗?

var u2 = new User();

console.log(u1.proto === u2.proto) // true

其实学到这里就可以产生一些骚想法了,多个实例的__proto__都指向构造函数的原型,那么实例如果能通过一种方式,访问原型上的方法,属性等,就可以实现继承的效果。

我们继续更新一下原型与原型链的关系图:

![在这里插入图片描述](https://img-blog.csdnimg.cn/ce26e887ac474250af075d930e862e7d.png?x-oss 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 -process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oiY5Zy65bCP5YyF,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)

[](()6. 原型链


实例对象在查找属性时,如果查找不到,就会沿着__proto__去与对象关联的原型上查找,如果还查找不到,就去找原型的原型,直至查到最顶层,这也就是原型链的概念。

就借助面试题,举几个原型链的例子:

[](()6.1举例

  1. u1.sayHello()

u1上是没有sayHello方法的,因此访问u1.__proto__(User.prototype),成功访问到sayHello方法

  1. u2.toString()

u2,User.prototype都没有toString方法,User.prototype也是一个普通对象,因此继续寻找User.prototype.__proto__(Object.prototype),成功调用到toString方法

[](()7. 提高升华


学完上面那些,大多数面试题都可以做出来了,例如下面这种

function A() {}

function B(a) {

this.a = a;

}

function C(a) {

if (a) {

this.a = a;

}

}

A.prototype.a = 1;

B.prototype.a = 1;

C.prototype.a = 1;

console.log(new A().a); //1

console.log(new B().a); //undefined

console.log(new C(2).a); //2

但距离解决文章的最初的面试题还欠缺些什么,比如Function.__proto__ === Object.__proto__、Function.prototype.__proto__ === Object.prototype.__proto__等,接着我们来一一攻克它。

[](()7.1 Objcet.__proto__Object.prototypeObject.prototype.__proto__

  • Object是构造函数,在第二部分我们讲过所有的函数都是通过new Function创建了,因此Object相当于Function的实例,即Object.__proto__ --> Function.prototype

  • Object.prototypeObject构造函数的原型,处于原型链的顶端,Object.prototype.__proto__已经没有可以指向的上层原型,因此其值为null

// 总结:

Object.proto --> Function.prototype

Object.prototype.proto --> null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值