构造函数、原型、instanceof运算符

news2024/11/16 16:18:44

通过构造函数创建对象

构造函数是学习面向对象的基础
任何函数都有原型对象

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        function Pig() {
            // this表示实例对象,本例中表示obj
            this.name = '佩奇' //obj.name='佩奇'
            this.age = 20
            // this.say = function () {
            //     console.log(this.name + '我是佩奇')
            // }
            // this.eat = function () {
            //     console.log('吃饭')
            // }

        }


        let obj1 = new Pig('乔治', 2)
        let obj3 = new Pig('老段', 4)
        // 当前问题,没创建一个对象就创建一个say和eat,但是多个对象中的say和eat相同,没必要存多个
        //解决方法,创建原型对象,相同的东西存一份
        //任何一个函数(普通函数,构造函数,内置的Array、String)都有原型对象,由系统分配,不用手动添加
        //console.dir()也是输出内容,而且输出后可以展开看到内部的结构
        console.dir(Pig)  //Pig.prototype就是Pig的原型对象
        console.log(Pig)
        console.log('--------------------')
        // 把构造函数中的eat、say方法,加给原型对象
        Pig.prototype.say = function () {
            console.log('会说话')
        }


        console.log(obj1)
        console.log(obj3)
    </script>

</body>

</html>

在这里插入图片描述

扩展内置构造函数

    <script>
        let arr = [2, 3, 5, 8]
        // console.log(typeof (arr))  //object
        // 数组为什么是对象
        // [2, 3, 5, 8]是字面量写法,实际上这个数组也是通过new Array()得来的
        // 内部实现 [2, 3, 5, 8]===new Array(2, 3, 5, 8)
        Array.prototype.sum = function () {
            // this表示实例对象,本利中的this表示[2,3,5,8]
            return this.reduce((t, c) => t + c)
        }
        console.log(arr.sum())  //调用原型对象定义的方法 //18

        // 给原型对象加方法的好处,任何实例对象都可以调用


    </script>

构造函数、原型对象、实例对象三者之间的关系

在这里插入图片描述

    <script>
        function Pig(name, age) {
            this.name = name
            this.age = age
        }

        // 向原型对象上添加方法
        Pig.prototype.say = function () { }
        Pig.prototype.eat = function () { }
        console.log(Pig.prototype.constructor) //Pig是构造函数:Pig.prototype找到原型对象:再点constructor再次找到构造函数

        // 实例化
        let obj = new Pig('佩奇', 3)
        console.log(obj.__proto__) //通过实例对象找到原型对象(非标准)  _,_proto_,_
        //其实,实例对象的[[Prototype]]属性才指向原型对象
        // 只不过,[[Protype]]是隐藏属性,不可访问,索引浏览器才实现了__proto__方法,用于访问原型对象
        // 但是,__proto__是js的非标准属性并且可能遗弃
        // 建议使用Object.getPrototypeOf(实例对象)语法,来找原型对象
        

    </script>

在这里插入图片描述

原型继承

让Animal的实例对象成为Pig的原型对象,那么Pig的实例对象,可以使用Pig原型对象上的方法,也可以使用Animal原型对象上的方法
在这里插入图片描述

     function Pig(name, age) {
            this.name = name
            this.age = age
        }

        // 修改Pig的原型对象为Animal的实例对象
        Pig.prototype = a
        let p = new Pig()
        // 因为修改了Pig的原型对象===Animal的实例对象,所以实例对象p就继承了Animal的实例对象a的属性和方法
        p.eat()

        // 通过原型继承后,需要手动修改原型对象的constructor属性,否则就不符合上述三角关系了
        // 要不然Pig的constructor将会指向Animal
        // 只要修改了原型对象,就得手动指定constructor属性
        // 固定语法:构造函数.prototype.constructor=构造函数,
        console.log(Pig.prototype.constructor)
        Pig.prototype.constructor = Pig
        console.log(Pig.prototype.constructor)

    </script>

原型链

基于原型对象的继承使得不同构造函数的原型对象关联在一起,并且这种关联的关系是一种链式结构,我们将原型对象的链状结构关系称为原型链
研究对象属性和方法的查找过程
对象属性(或方法)查找机制
a)当查找对象的某个属性(包括方法)时,优先从当前对象自身中查找
b)当前对象中没有该属性,则向上层原型对象中查找
c)如果原型对象中也没有该属性则继续向上层原型对象中查找
d)…
f)一直查找到最顶层位置,找到则使用该属性,找不到则得到null
Object.prototype是最顶层的原型对象
Array、String等的原型对象也是它

在这里插入图片描述

instanceof 运算符

语法:

实例对象 instanceof 构造函数

instanceof用于检测实例对象的原型链上,是否有语法中给出的构造函数

  <script>
        function Animal() {

        }
        Animal.prototype.eat = function () {
            console.log('会吃饭')
        }
        let a = new Animal()
        // -------------------------------------------Pig
        function Pig(name, age) {
            this.name = name
            this.age = age
        }

        // 修改Pig的原型对象为Animal的实例对象
        Pig.prototype = a
        let p = new Pig()
        // 因为修改了Pig的原型对象===Animal的实例对象,所以实例对象p就继承了Animal的实例对象a的属性和方法
        console.log(p instanceof Animal)
        console.log(p instanceof Object)
        console.log(p instanceof Pig)

    </script>

在这里插入图片描述

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

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

相关文章

卡尔曼滤波器笔记——最详细

笔记来源— 卡尔曼滤波算法原理及代码实现&#xff01;https://www.bilibili.com/video/BV1WZ4y1F7VN/?spm_id_from333.337.search-card.all.click&vd_source8d55784dc9c7530bc9e3fa220380be56 简单介绍一下 现在我们就是不知道是距离多少&#xff0c;就需要用到这个卡尔…

C++进阶--mep和set的模拟实现

红黑树链接入口 底层容器 模拟实现set和map时常用的底层容器是红黑树。 红黑树是一种自平衡的搜索二叉树&#xff0c;通过对节点进行颜色标记来保持平衡。 在模拟实现set和map时&#xff0c;可以使用红黑树来按照元素的大小自动排序&#xff0c;并且保持插入和删除操作的高效…

缓冲区与C库函数的实现

目录 一、缓冲区 二、C库函数的实现 一、缓冲区 缓冲区本质就是一块内存&#xff0c;而缓冲区存在的意义本质是提高使用者(用户)的效率【把缓冲区理解成寄送包裹的菜鸟驿站】 缓冲区的刷新策略 1. 无缓冲(立即刷新) 2. 行缓冲(行刷新) 3. 全缓冲(缓冲区满了&#xff0c;再刷…

三. 操作系统 (6分) [理解|计算]

🌟三. 操作系统 (6分) [理解|计算] PV操作, 分页存储管理, 文件的索引, 位示图 考试重点 文章目录 🌟三. 操作系统 (6分) [理解|计算]==PV操作, 分页存储管理, 文件的索引, 位示图 考试重点==3.1 进程管理3.2 存储管理3.3 设备管理3.4 文件管理3.1 进程管理 进程的特征 进…

部署docker仓库harbor

1、下载包 1、包已上传有两个harbor.v2.6.0.tar与harbor.tar 2、harbor.tar解压后会生成harbor目录&#xff0c;将harbor.v2.6.0.tar移动到harbor目录下。 3、执行harbor目录下的install.sh 4、执行完后修改配置文件 2、修改配置文件 vim /root/harbor/make/ harbor.yml.tmpl …

【JAVA】CSS3:3D、过渡、动画、布局、伸缩盒

1 3D变换 1.1 3D空间与景深 /* 开启3D空间,父元素必须开启 */transform-style: preserve-3d;/* 设置景深&#xff08;你与z0平面的距离 */perspective:50px; 1.2 透视点位置 透视点位置&#xff1a;观察者位置 /* 100px越大&#xff0c;越感觉自己边向右走并看&#xff0c;…

亚信安慧AntDB:系统稳定性的守护

在国产化升级改造的过程中&#xff0c;AntDB不断地适应不同的需求&#xff0c;为用户提供个性化的解决方案。其致力于确保数据安全和系统稳定&#xff0c;预防数据泄露和系统崩溃等问题的发生。AntDB的团队不仅专注于技术的提升和创新&#xff0c;更关注用户的实际需求&#xf…

Docker 笔记(五)--链接

这篇笔记记录了Docker 的Link。 官方文档&#xff1a; Legacy container links - Communication across links 目录 参考Legacy container linksConnect using network port mappingConnect with the linking systemThe importance of naming Communication across linksEnviro…

《IAB视频广告标准:综合指南(2022)》之概述篇 - 我为什么要翻译介绍美国人工智能科技公司IAB 系列(2)

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

漫步者、南卡、Oladance开放式耳机怎么样?巅峰测评谁是公认力作

​最近朋友们经常向我询问开放式耳机的选择问题&#xff0c;他们购买了开放式耳机后发现音质不佳&#xff0c;上耳佩戴舒适性几乎为零。市面上的开放式耳机琳琅满目&#xff0c;大家不知道该如何选择。漫步者、南卡、Oladance开放式耳机怎么样&#xff1f;我作为音乐爱好者已经…

Java实现PDF文字内容识别,结合OCR实现PDF图片实现

使用插件&#xff1a;UMI-OCR、PDFBOX 实现思路&#xff1a;通过PDFBOX识别PDF文字&#xff0c;如果是图片&#xff0c;则识别不出来&#xff0c;再调用OCR进行识别返回文字&#xff1b;OCR识别较慢&#xff0c;长图识别不出来&#xff0c;目前HTTP方式只支持图片格式&#xf…

变量柱塞液压泵比例阀放大器

液压泵把动力机的能转换成液压的压力能。使用在开式和闭式系统里在固定和移动的设备上&#xff0c;通过电比例放大器控制比例阀线圈驱动液流方向压力流量。BEUEC比例放大器适用控制方式&#xff1a;电比例控制&#xff08;12VDC、24VDC&#xff09;&#xff0c;控制闭式泵系列4…

消费补贴模式,刺激消费需求,重塑商业格局

​小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 在…

小明的背包——01背包问题

经典版 题目链接&#xff1a;1.小明的背包1 - 蓝桥云课 (lanqiao.cn) 01背包问题中&#xff0c;每种物品只有两种状态&#xff0c;即拿或不拿。设状态dp[i][j]max(dp[i-1][j],dp[i-1][j-w]v)&#xff1b;如果不拿物品i&#xff0c;那么最大价值就是dp[i-1][j]&#xff0c;如果…

【软件工具】网络性能测试工具 Iperf

Iperf 是一款专业的开源网络性能测试工具&#xff0c;它被广泛用于测量网络带宽、延迟、抖动和数据包丢失等网络性能指标&#xff0c;支持 TCP 和 UDP 等&#xff0c;可用于点对点或客户端-服务器等模式的网络测试。 软件获取 官方下载地址&#xff1a;https://iperf.fr/iper…

最新若依项目快速上手

最新若依项目快速上手 配套视频&#xff1a;若依项目快速上手视频 1. 下载源码 官网&#xff1a;https://ruoyi.vip/ 前端 git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git后端 git clone https://gitee.com/y_project/RuoYi-Vue.git2. 数据库 创建数据库ry-vue…

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

在线编辑字体工具,支持对字体查看编码以及编辑

公司一个沉寂多年的项目需要进行二开&#xff0c;前面的开发的同学已经离开&#xff0c;对于项目情况了解较少&#xff0c;开发的时候发现缺失很多小图标&#xff0c;但是对原来有那些图标也不太了解 目标 1、知晓字体包里的旧的图标是什么样子的&#xff1f;2、在旧字体包中导…

图像处理与图像分析—图像统计特性的计算(纯C语言实现灰度值显示)

根据输入的灰度图像&#xff0c;分别计算图像的均值、方差等统计特征&#xff0c;并计算图像的直方图特征并以图形方式显示图像的直方图&#xff08;用C或C语言实现&#xff09;。 学习将会依据教材图像处理与图像分析基础&#xff08;C/C&#xff09;版内容展开 在上个笔记中&…

hdml接口无信号,设备管理器报错:由于该设备有问题,Windows 已将其停止。 (代码 43)

今天&#xff0c;由于带电脑外出演示系统&#xff0c;回公司突然hdml接口无信号了&#xff0c;试了同事的电脑没问题&#xff0c;所以排除显示器和线束问题&#xff0c;最后找到设备管理器报错&#xff1a;由于该设备有问题&#xff0c;Windows 已将其停止。 (代码 43)以下是排…