JavaScript原型、原型链、原型方法

news2025/2/21 1:06:49

文章目录

  • 原型和原型链
    • prototype、 __ proto __ 、constructor
    • 原型链
  • 原型方法
    • instanceOf
    • hasOwnProperty
    • Object.create()、new Object()
  • 总结


原型和原型链

prototype、 __ proto __ 、constructor

首先我们看下面一段代码

    // 构造函数Person
    function Person(name, age) {
      this.name = name;
      this.age = age;
      this.sayHello = function () {
        console.log('hello')
      }
    }

    // 给Person的原型上挂载属性和方法
    Person.prototype.sex = 'male'
    Person.prototype.sayName = function () {
      console.log(this.name);
    }

    // 实例化Person对象
    const person1 = new Person('Jack', 20);
    const person2 = new Person('Dave', 30);

    console.log(person1.__proto__ === Person.prototype ) // true
    console.log(person1.__proto__ === person1.__proto__) // true
    console.log(Person.prototype.constructor === Person) // true

在这段代码中,共做了三件事

  • 创建一个名为 Person 的构造函数,它接收 nameage 属性,同时 sayHello 方法
  • 给构造函数 Personprototype 挂载新的属性和方法
  • 创建 Person 的实例对象 person1 person2

查看打印结果:

    console.log(person1.__proto__ === Person.prototype ) // true
    console.log(person1.__proto__ === person2.__proto__) // true
    console.log(Person.prototype.constructor === Person) // true

结论

  • 构造函数有一个prototype原型对象, 原型对象里的constructor指向构造函数本身
  • 每个对象都有一个__proto__属性,并且指向它的构造函数的原型对象(prototype)

在这里插入图片描述

原型链

那么原型的存在到底有什么作用呢,其实就是一句话:对象不必存储所有的属性或方法,而可以通过原型层层向上查找,减少内存的占用

还是上面的例子,调用以下代码:

	person2.sayHello() // hello
   	person2.sayName()  // Dave

实例对象person2并没有直接定义方法sayName,但是它可以调用它的构造函数 Person 原型上的方法

在这里插入图片描述

接下来再加一行

	console.log(person2.toString()) // "[object Object]"

打印的结果为 “[object Object]”,说明person2实例对象是存在这个方法的,但是person2本身和它的构造函数都没有定义 toString 方法,显然,它是在原型链上找到的:

在这里插入图片描述

这条绿色的线就是 原型链

  • person2 实例对象本身没有toString方法,会顺着原型链找向它的构造函数Person的原型
  • Person 对象本身也没有toString方法,会继续顺着原型链找向它的构造函数Object的原型
  • 最终在Object的原型上找到了该方法,如果还没有找到,就会报null

原型方法

instanceOf

A instanceOf B 运算符用于检测A的原型链上是否存在构造函数B的 prototype属性,即沿着A的原型链向上寻找,能否找到B;能找到返回 true,否则返回 false。

    const arr = new Array(['a','b','c'])  
    
    console.log(person1 instanceof Person) // true
    console.log(person1 instanceof Array)  // false
    console.log(person1 instanceof Object) // true

    console.log(arr instanceof Person)  // false
    console.log(arr instanceof Array)   // true
    console.log(arr instanceof Object)  // true

原型链的终点指向Object,因此js中有一句话:万物皆对象

hasOwnProperty

A.hasOwnProperty(B) 判断对象 A 本身是否有属性或对象 B。有则返回true,没有返回false,此方法不会沿着检查对象A的原型链寻找B

	 console.log(person1.hasOwnProperty('age')) // true
    console.log(Person.hasOwnProperty('age'))  // false
    console.log(Object.hasOwnProperty('age'))  // false

构造函数只有在实例化时才具备属性age

Object.create()、new Object()

  • var B = Object.create(A) 返回一个新对象B, B的原型指向A, 即B.__proto__ === A
  • var B = new Object(A)B===A
    const person3 = Object.create(person2)
    const person4 = new Object(person2)
    console.log(person3.__proto__ === person2, person3 === person2) // true false
    console.log( person4 === person2) // true

当A为基本类型,var B = new Object(A)返回它本身,当A为空时,返回一个空对象

总结

原型和原型链

  • prototype、 __ proto __ 、constructor
  • 原型链

原型方法

  • instanceOf
  • hasOwnProperty
  • Object.create()、new Object()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无法访问org.springframework.boot.SpringApplication

问题 更新idea版本后使用过程中发生下面的错误 Error:(3, 32) java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: D:\maven-repository\org\springframework\boot\spring-boot\3.0.0\spring-boot-3.0.0.jar(org/springframework/boot/SpringApplicati…

【ChatGPT】如何使用python调用ChatGPT API?

是什么ChatGPT? ChatGPT 是由 OpenAI 开发的一个语言模型。OpenAI 是一家领先的人工智能研究机构。ChatGPT 基于变换器架构,使用深度学习生成会话风格的文本。该模型在大量文本数据上进行训练,并可以针对特定任务进行微调。例如,它…

2023年,产业互联网八大趋势

从全世界的TO B发展线来看,中国的TO B企业不是脚步最快的,但它们却也正在通过汲取中国数字经济高速发展的养料不断成长,同时主动下沉,成为新的产业数字化的底盘,做撑举起未来数字中国的无名力量。 作者|皮爷 出品|…

UDS 诊断

UDS全称为Unified Diagnostic Services,统一的诊断服务。由ISO-14229系列标准定义。 诊断通信的过程从用户角度来看非常容易理解,诊断仪发送诊断请求(request),ECU给出诊断响应(response),而UDS就是为不同…

1.9实验9:配置虚链路

1.4.4实验9:配置虚链路 实验目的(1) 实现OSPF 虚链路的配置 (2) 描述虚链路的作用 实验拓扑配置虚链路实验拓扑如图1-19所示。[1] 图1-19 配置虚链路 实验步骤

第2集丨Java中的数据类型汇总

目录一、数据类型分类二、基本数据类型取值范围数据类型的转换byte和char的关系三、包装类一、数据类型分类 二、基本数据类型 取值范围 比特(bit位) : 数据运算得最小存储单位字节(byte) : 数据最小存储单位bit和byte可以互相转换得,1 byte 8 bit位默认情况下&am…

2023开学季哪款电容笔值得买?高品质电容笔品牌推荐

我们可以看出,原先的苹果电容笔的价格卖得非常昂贵。事实上,对于那些没有过多预算的人来说,平替电容笔是最好的选择。想象一下,一款原装的苹果电容笔,能够购买四款平替电容笔,而平替电容笔在性能上&#xf…

修改windows系统网卡的MAC地址方法

文章目录前言修改MAC地址验证MAC地址是否修改前言 工作中遇到通过绑定IP地址和MAC地址认证才能上网的网络,需要修改指定的IP地址和MAC地址,修改IP地址比较简单,但是MAC地址之前好像没有改过,浅浅的记录一下 修改MAC地址 首先打…

MicroApp初探

微前端 微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。各个前端应用还可以独立运行、独立开发、独立部署。微前端架构与框架无关,每个微应用都可以使…

VMware虚拟机安装部署CentOS7+Moba远程连接+克隆(步骤)

使用VMware部署centos7操作系统 1. 打开VMware点击“创建新的虚拟机” 2.按提示逐步选择 选择NAT模式(只要电脑能联网,虚拟机就能联网) 磁盘存为单个文件 点击“使用iso映像文件”,选择已经下载好的镜像文件。 (虚…

火爆全网的ChatGPT对话数据可视化,分析数据可视化的应用和发展

ChatGPT为一款由OpenAI开发的人工智能聊天软件。2022年11月30日上映。截至2023年1月底,其月活跃用户超过1亿,是有史以来增长最快的消费应用。今年AIGC(是指利用人工智能技术来生成内容)频繁出圈,先是一个基于diffusion…

【转载】Visual Studio 下载进度很慢甚至不动怎么办?

原文链接:https://zhuanlan.zhihu.com/p/566305175 现在越来越多的人投身到计算机行业成为了一名码农,对于一个合格的码农来说能熟练的使用Visual Studio,Visual Studio code,idea等是很重要的,也有很多人在软件下载方面就遇到了难…

python【os模块文件读写操作】超详细

一、os 模块是什么:os 模块是python 标准库中整理文件和目录最为常用的模块,该模块提供了非常丰富的方法用来处理文档和目录二、认识文件路径分隔符:- 路径表示"\"在windows操作系统中表示区分文件的存储路径层级关系比如&#xff…

2022爱分析 · DataOps厂商全景报告 | 爱分析报告

报告编委 李喆 爱分析合伙人&首席分析师 廖耘加 爱分析分析师 目录 1. 研究范围定义 2. 市场洞察 3. 厂商全景地图 4. 市场分析与厂商评估 5. 入选厂商列表 1. 研究范围定义 研究范围 在后疫情时代,以数据分析为代表的数据消费场景日益丰富&…

Linux 用户讲解

目录 Linux 用户介绍 Linux用户类型 UID 用户组ID Linux 用户相关命令 id 查看用户信息 useradd 创建新的用户账户 groupadd 创建新的用户组 usermod 修改用户的属性 passwd 修改用户的密码、过期时间等 userdel 删除用户 通过文件的方法新建、编辑用户 /etc/p…

【操作系统】磁盘IO常见性能指标和分析工具实战

1.磁盘读写常见的指标 (1)IOPS(Input/Output Operations per Second) 指每秒能处理的I/O个数,表示块存储处理读写(输出/输入)的能力,单位为次,有顺序IOPS和随机IOPS比如…

设计模式第五讲-装饰器模式和代理模式详解

一. 装饰器模式 1. 背景 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以…

软件测试工程师需要掌握哪些技能呢?

在谈到软件测试工程师时,许多人还是会想到那些重复使用软件并试图在频繁的操作中发现 BUG的人,也就是人们常说的按照测试规范和测试案例来测试软件,检查软件是否有错误,判断软件是否稳定。但这是一个很老派和错误的观点。 由于以…

持续测试:企业的4项策略

对于旅游业和酒店服务来说,节假日无疑是最繁忙的时期。2022年的节假日历经了多重变化,恶劣的天气以及不可抗力因素影响了许多出行计划,也影响了航空公司的运营。为了确保一个顺利和成功的假期,开发团队必须为意想不到的事情做好准…

openvino yolov5/ssd 实时推流目标检测在html上显示

安装ffmepg并添加到环境变量中,流媒体使用m7s 运行效果 SSD:检测在10ms左右,yolov5在100ms左右 app.py #!/usr/local/bin/python3 # encodin: utf-8import subprocess import threading import time import cv2 import osfrom OpenVinoYoloV…