当前位置: 首页 > news >正文

JS原型概念讲解

1.对象中存储属性的区域实际有两个

- 对象自身

 --比如直接通过对象所添加的属性
 --在类中通过x = y 的形式添加的属性,位于对象自身中

- 原型中存储

 --对象中还有一些内容,会存储到其他对象中(原型对象)
 --在对象中会有一个属性用来存储原型对象,这个属性叫做__proto__
 --原型对象也负责为对象存储属性
 当我们访问对象中的属性时,会优先访问对象自身的属性
 对象自身不包含该属性时,才会去原型对象中寻找
--会添加到原型对象中的情况:
     1.在类中通过xxx() {} 方式添加的方法,位于原型中
     2.主动向原型中添加的属性或方法

例子:

class Person {
        name = "孙悟空"
        age = 18

        sayHello() {
            console.log("我是", this.name)
        }
    }
    const per = new Person()
    console.log(per)

按道理,应该输入一个包含sayHello的对象,但是实际上

在这里插入图片描述
sayHello方法并不是在age和name一层级,而是在Prototype中。
这就是一个叫做原型的地方存储着。

2.如何访问一个对象的原型呢?两种方式

  class Person {
        name = "孙悟空"
        age = 18

        sayHello() {
            console.log("我是", this.name)
        }
    }

    const per = new Person()
    console.log(per)
    console.log(per.__proto__)
    console.log(Object.getPrototypeOf(per))

在这里插入图片描述

3.原型对象中的数据:

  • 1.对象中的数据(属性、方法等)

  • 2.constructor (对象的构造方法)

注意:
原型对象也有原型,这样就构成了一条原型链,根据对象的复杂程度不同,原型链的长度也不同,比如

 class Person {
        name = "孙悟空"
        age = 18

        sayHello() {
            console.log("我是", this.name)
        }
    }

    const per = new Person()
    console.log(per)
    console.log(per.__proto__)
    console.log(Object.getPrototypeOf(per))
    console.log(per.__proto__.__proto__)
    console.log(per.__proto__.__proto__.__proto__)

在这里插入图片描述
可以看出构成了原型链。

总结:
原型链:
读取对象属性时,会优先对象自身属性,
如果对象中有,则使用,没有则去对象的原型中寻找
如果原型中有,则使用,没有则去原型的原型中寻找
知道找到Object对象的原型,Object的原型没有原型(为null)

原型的作用:
原型就相当于一个公共的区域,可以被所有该类实例访问,
可以将一个该类实例中,所有的公共属性(方法)统一存储到原型中
这样我们只需要创建一个属性,即可被所有实例访问
JS中继承就是通过原型来实现的,
当继承时,子类的原型就是一个父类的实例

相关文章:

  • 2024-5-16
  • Jenkins 忘记登录密码怎么办
  • scanf读取标准输入
  • 每日刷题(1)
  • 2024kali linux上安装java8
  • 【重生之我在学Android】WorkManager (章一)
  • RK3568平台 RTC时间框架
  • 【UE 材质】水晶材质
  • 【管理咨询宝藏资料28】某信息技术有限公司战略规划报告
  • 关于使用Mxnet GPU版本运行DeepAR报错解决方案
  • 第102讲:MySQL多实例与Mycat分布式读写分离的架构实践
  • Java 1.8 docker 镜像制作
  • 【REST系列】详解REST架构风格 —— 带你阅读Web发展史上的一个重要技术文献
  • 用C++写了基于gec6818开发板上LCD操作的一个类--附带注释(详细)
  • 3、spring cloud 五大组件
  • Redis_在Windows上启动多个Redis服务端
  • 项目启动端口被占用 -- Web server failed to start. Port 8082 was already in use.
  • 做运营如何蹭热点?
  • JAVA反序列化学习笔记
  • 小程序-网络数据请求
  • Vue中KeepAlive 原理与源码分析
  • 蛇形矩阵(模拟)
  • SpringMVC---->自我实现底层机制(吃透springMVC)
  • 计算机毕业设计(附源码)python医疗健康查询系统
  • 找个好用的录屏软件,怎么这么难?
  • 【Node.js】模块的加载机制
  • JavaScript大作业 基于HTML+CSS+JavaScript站酷静态页面官网7页
  • 助力汽修企业突破转型瓶颈,S2B2B商城价格管理模块实现采购交易数字化升级
  • Python作业十一:螺旋矩阵与正方形二维列表
  • 【前端】CSS(3) —— CSS的盒模型与弹性布局
  • 2022高频经典前端面试题(vue2+vue3+typescript+nodejs下篇,含答案)
  • springboot整合flink(二)