原型链

这篇博客主要介绍了JavaScript中的原型链概念,包括如何创建对象、原型、构造函数和原型链的定义。通过实例解析了New操作符的工作原理以及instanceOf运算符的判断逻辑。文章强调了原型链的作用,即当对象找不到所需属性或方法时,会向上查找,直到找到或返回null,同时也探讨了原型对象的共享特性及其优点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 创建对象

原型链创建对象有 三种 主要的形式
在这里插入图片描述

第三种方式详解:
p是一个对象,将p作为参数放入object.create()中。
生成一个o3对象即o3的 _ ptoto _指向的就是p。也就是说p是o3的原型对象。
即Object.create方法是把参数中的对象作为一个新对象的原型对象赋给o3,o3本身没有需要的属性,是通过原型链获得

在这里插入图片描述

混合方式最好

二. 原型(对象)、构造函数、对象、原型链的定义

在这里插入图片描述

  1. 实例: 在这里插入图片描述在这里插入图片描述
  2. 构造函数:
    只要用new去操作,就是构造函数
    构造函数的变量名首字母一定要大写!!
    在这里插入图片描述
    在这里插入图片描述
    1 - 2. New 构造函数通过New来创建一个实例
    在这里插入图片描述
    在这里插入图片描述
  3. 原型: 每个对象在其内部初始化一个属性。函数通过prototype属性初始化的一个空对象

2 - 3. prototype 函数都有prototype属性,会为初始化一个空对象,即原型对象
在这里插入图片描述在这里插入图片描述

3 - 2. constructor 构造器 原型对象通过constructor区分自己是被那个构造函数所引用
构造器会默认声明的函数
在这里插入图片描述
在这里插入图片描述
1- 3 _ proto _
实例的_ proto _ 其实就是指 其自己的构造函数的prototype
在这里插入图片描述
在这里插入图片描述

原型链:
如果当前对象内不存在需要的属性和方法,就会去这个对象的prototype里去找,原型对象又有自己的_ proto 和prototype.所以如果这个对象的prototype仍未找到该属性或方法,就会继续向上找。一直到找到或者返回null
【object.prototype是顶端】
原型链基本原理:
任何一个实例对象通过原型链找到其上面的原型对象,那上面的方法和属性都是被实例所共享,即被不同实例所共用
在这里插入图片描述
优:
原型对象:一次性给一堆对象添加属性和方法的对象
可以共用原型对象的属性和方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
o3和o5均有say这个方法
在这里插入图片描述
只有函数才有prototype
==只有对象才有
proto _==【函数也是对象】

三. New

在这里插入图片描述
第一步:创建一个新对象,这个对象是继承了该构造函数的原型对象
在这里插入图片描述
【此时是新建了一个空对象,还没生成实例对象】
在这里插入图片描述
第二步:会把新创建的空对象与this相关联,【如果没有办法把这个构造函数的上下文转到新实例上的话,最后返回的对象没法相关联】

在这里插入图片描述
第三步:要不要返回这个新建的对象呢?–> 有返回对象就返回,否则就返回生成的新对象

在这里插入图片描述
整个工作原理
在这里插入图片描述
在这里插入图片描述

四. instanceOf

原理
判断实例对象是不是这个构造函数的实例时,其实判断的是实例对象的 _ proto _ 属性 和 构造函数的 prototype属性是不是引用的同一个地址
原型对象也会向上有自己的 _ proto _属性和构造函数,但只要是在这条链上的,都会返回true
在这里插入图片描述
因为在这里插入图片描述
所以不能轻易的说o3是Object的实例。【因为o3原本应该是M的实例,只不过M.prototype.proto _ 就等于 object.prototype.也就是说object也在这条链上】
所以要用constructer来判断是否是其实例在这里插入图片描述
所以用 constructer判断实例对象从严谨意义上说比instanceof更好
实例对象的
proto _ 实际上引用的是原型对象,与实例的构造函数没多大关联
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值