JS原型及原型链

欢迎来到“雪碧聊技术”CSDN博客!

在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。

让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!

目录

一、创建对象的方式

1、Java语法中,创建对象的方式

①通过构造函数

2、JS语法中,创建对象的方式

①通过普通方式(直接new Object)

②通过字面量{ }

③通过自定义构造函数(即:Java中的构造器/构造函数)

二、原型(prototype)

1、原型的概念

举例:

 在控制台查看原型:

 2、原型的简写

3、案例:给String类添加一个原型方法(静态方法)

三、继承的概念

1、Java语法中的继承

2、JS语法中的继承

举例:

四、原型与原型链

1、结论一:任何函数都有一个属性为原型(prototype)对象,并且里面的constructor属性指向函数本身。

举例:

2、结论二:对象中,也有原型对象,只不过不是叫prototype,而是叫_ _proto_ _,这两个对象本质上是一个。即:对象和构造它的构造函数,拥有同一个原型对象,只是名称不一致,一个叫prototype,一个叫_ _proto_ _。

举例:

类比:就好比java中,一个类的静态变量/静态方法,在该类的对象实例中也会存在这个静态变量/静态方法,只不过我们平时不建议通过对象实例来调用,因为通过类直接就可以调用。

3、原型对象是由Object函数构造的。因此原型对象也会有一个原型对象,和Object函数中的原型对象是同一个对象。(这就叫原型链)

举例:

示意图:

注意:由于Object是顶级父类,因此Object()构造函数中的原型对象就不再往上指了,因此为null。

4、思考1:对象为什么有toString方法?

原型链:下图中,红色的箭头,就是原型链。

5、结论4

①函数也是对象(因为万物皆对象),因此函数也会有__proto__,指向的是Function的原型对象(二者本质是一个)

②原型对象prototype也是对象,因此也会有__proto__,最终都是指向顶级父类Object的原型对象。

示意图:

6、思考2:为什么所有函数都会有call方法?

五、综合应用1:Vue框架中,vue实例对象(vm)与组件对象(vc)的原型链分析

结语


一、创建对象的方式

1、Java语法中,创建对象的方式

①通过构造函数

运行结果:

2、JS语法中,创建对象的方式

①通过普通方式(直接new Object)

//通过new Object,创建一个对象
let student1 = new Object();
student1.id='001'
student1.name='jack'
student1.sayHi = function(){console.log("我叫"+this.name+",id是"+this.id)
}//访问该对象的属性和方法
console.log(student1.name)
student1.sayHi()

运行结果:

②通过字面量{ }

//通过字面量,声明对象
let student1 = {id:'001',name:'Jack',sayHi:function(){console.log("我叫"+this.name+",id是"+this.id)}
}//访问该对象的属性和方法
console.log(student1.name)
student1.sayHi()

运行结果:

 

③通过自定义构造函数(即:Java中的构造器/构造函数)

//自定义构造函数
function Student(id,name){this.id = id;this.name = name;this.sayHi = function(){console.log("我叫"+this.name + ',id是'+this.id)}
}//通过自定义构造函数,创建对象
let student1 = new Student('001', 'tom');
let student2 = new Student('002', 'lucy');//访问对象的属性和方法
console.log(student1.name)
student1.sayHi()
console.log(student2.name)
student2.sayHi()

运行结果:

二、原型(prototype)

1、原型的概念

原型就类似于Java中的静态(static)这个含义。

说白了,原型是用来定义某个类的类变量/类方法的。

原型也是一个对象,里面的属性和方法都是类的静态属性和静态方法。

举例:

//自定义构造函数
function Student(id, name) {this.id = id;this.name = name;this.sayHi = function () {console.log("我叫" + this.name + ',id是' + this.id)}
}
//定义Student类的原型
Student.prototype.count = 100  //原型(静态)属性
Student.prototype.study = function(){  //原型(静态)方法console.log('共享学习空间')
}//通过自定义构造函数,创建对象
let student1 = new Student('001', 'tom');
let student2 = new Student('002', 'lucy');//访问对象的原型属性和方法
console.log(student1.count)
console.log(student2.count)
console.log(student1.count === student2.count)
console.log(student1.study)
console.log(student2.study)
console.log(student1.study === student2.study)

运行结果:

 在控制台查看原型:

 2、原型的简写

3、案例:给String类添加一个原型方法(静态方法)

let str = new String("helloworld")
//给String类添加一个原型方法(静态方法)
String.prototype.myJoin = function(){console.log("我是String类新增的原型方法")
}//查看str对象的内容
console.log(str)//调用str对象的myJoin方法
str.myJoin()

运行结果:

三、继承的概念

1、Java语法中的继承

2、JS语法中的继承

首先声明,在JS中,没有继承这个功能。因此我们只能借助原型,来实现继承这个功能。

举例:

//自定义Person构造函数
function Person(id, name){this.id = idthis.name = namethis.eat = function(){console.log('人吃饭')}
}//自定义Teacher构造函数
function Teacher(edu){this.edu = eduthis.teach = function(){console.log('教师教书')}
}//利用原型来让Teacher继承Person,说白了此时这个Person对象是Teacher类的静态。
Teacher.prototype = new Person(1,'王强')//创建Teacher类的对象实例teacher
let teacher = new Teacher('博士')
teacher.teach()
teacher.eat()
console.log(teacher.id, teacher.name, teacher.edu)

运行效果:

四、原型与原型链

1、结论一:任何函数都有一个属性为原型(prototype)对象,并且里面的constructor属性指向函数本身。

举例:

//自定义构造函数,有属性为prototype原型对象,且其中的constructor属性也指向String()函数本身
function Person(id, name){this.id = idthis.name = name
}console.log(Person.prototype.constructor === Person)//官方自带的String()函数,也有属性为prototype原型对象,且其中的constructor属性也指向String()函数本身
console.log(String.prototype.constructor === String)

运行结果:

2、结论二:对象中,也有原型对象,只不过不是叫prototype,而是叫_ _proto_ _,这两个对象本质上是一个。即:对象和构造它的构造函数,拥有同一个原型对象,只是名称不一致,一个叫prototype,一个叫_ _proto_ _。

举例:

//自定义构造函数
function Person(id, name){this.id = idthis.name = namethis.eat = function(){console.log('人吃饭')}
}//利用自定义构造函数,创建一个对象p1
let p1 = new Person('001','张三')//查看对象p1的__proto和构造函数Person的prototype是否是同一个对象
console.log(Person.prototype === p1.__proto__)//true

运行结果:

类比:就好比java中,一个类的静态变量/静态方法,在该类的对象实例中也会存在这个静态变量/静态方法,只不过我们平时不建议通过对象实例来调用,因为通过类直接就可以调用。

3、原型对象是由Object函数构造的。因此原型对象也会有一个原型对象,和Object函数中的原型对象是同一个对象。(这就叫原型链)

举例:

//自定义构造函数
function Person(id, name){this.id = idthis.name = namethis.eat = function(){console.log('人吃饭')}
}//Person构造函数,有一个原型对象(Person.prototype)。
//且该原型对象中,还有一个原型对象(Person.prototype.__proto__)(因为是对象,就会有一个属性为原型对象),指向构造函数Object的原型对象(Object.prototype)。
console.log(Person.prototype.__proto__ === Object.prototype)//true

运行结果:

示意图:

注意:由于Object是顶级父类,因此Object()构造函数中的原型对象就不再往上指了,因此为null。

4、思考1:对象为什么有toString方法?

因为顶级父类Object中,有toString()方法,因此通过原型链(类似于继承),所有对象都能获取到这个toString()方法。

原型链:下图中,红色的箭头,就是原型链。

5、结论4

①函数也是对象(因为万物皆对象),因此函数也会有__proto__,指向的是Function的原型对象(二者本质是一个)

②原型对象prototype也是对象,因此也会有__proto__,最终都是指向顶级父类Object的原型对象。

示意图:

6、思考2:为什么所有函数都会有call方法?

因为通过原型链,继承到了Function原型对象中的call方法。

五、综合应用1:Vue框架中,vue实例对象(vm)与组件对象(vc)的原型链分析

结语

以上就是JS的原型、原型链的全部内容。其中这个知识点应用到了Vue中的vm和vc关系,因此我们必须了解这些知识。

想了解更多的JS知识,请关注本博主~~

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

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

相关文章

List【Redis对象篇】

🏆 作者简介:席万里 ⚡ 个人网站: 文章目录 LIst1.简介2.使用场景3.常用操作1.写操作2.读操作 4.底层实现5.压缩列表的优化1.ZIPLIST结构2.ziplist更新数据3.LISTPACK优化 6.总结(重点) LIst 1.简介 Redis List是一组…

专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。

考研成功上岸,苦尽甘来,专业818信号系统与数字电路125,总分400,被南理工录取,从最早信心满满,到中期犹豫不决,到后期破釜沉舟,一路颠颠簸簸,总算坚持过来了,群…

ruoyi Cannot find module ‘@/views/system/user/index‘

Cannot find module /views/system/user/index 删除node_module 后打包成功

mall-admin-web开源项目搭建教程(图文)

本章教程,介绍如何在本地部署运行mall-admin-web这个开源项目。 开源地址:https://gitee.com/macrozheng/mall-admin-web mall-admin-web是一个电商后台管理系统的前端项目,基于Vue+Element实现。主要包括商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计…

【计算机视觉】边缘检测

图像的边缘简单来说就是图像中灰度不连续的地方。 1.图像梯度 图像梯度是指图像像素灰度值在某个方向上的变化;图像梯度是图像的一阶导数,实际计算时可以使用差分来近似。 1.1 什么是图像梯度? 图像梯度是一种数学工具,用于描…

Microsemi Libero SoC免费许可证申请指南(Microchip官网2024最新方法)

点击如下链接: https://www.microchip.com/en-us/products/fpgas-and-plds/fpga-and-soc-design-tools/fpga/licensing 点击右侧,请求免费的License 如果提示登录,请先登录Microchip账号。 点击Request Free License。 选项一年免费的Li…

[C++]类的继承

一、什么是继承 1.定义: 在 C 中,继承是一种机制,允许一个类(派生类)继承另一个类(基类)的成员(数据和函数)。继承使得派生类能够直接访问基类的公有和保护成员&#xf…

harbor镜像仓库搭建

Harbor简介 Harbor的发展背景和现状 Harbor项目起始于2014年左右,当时正值容器技术和微服务架构迅速崛起的时期。随着越来越多的企业开始采用容器化部署应用,对于私有镜像管理的需求也日益增长。传统的解决方案要么缺乏必要的企业级特性(如访问控制、安全性和可扩展性),…

01-51单片机硬件基础

开发板介绍 学校授课用的是普中科技的EM3.V2.2开发板,没什么好说的,记着去淘宝上找原理图,别迷信课本。 网上有卖51最小系统板的,比开发板便宜,也有下载模块,可以自己搭建外围电路。 还可以自己在protue…

方法引用和lambda表达式的奥妙

方法引用替代Lambda表达式 什么情况可以使用方法引用替代lambda表达式? 下面代码中两处使用了lambda表达式,一个是filter内,一个是forEach内。其中,forEach内的lambda表达式可以被方法引用替代,但是filter内的lambda…

Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)

使用步骤分为两步 第一步导入 okhttp3 依赖 第二步调用本文提供的 utils 第一步这里不做说明了,直接提供第二步复制即用 DownloadUtil 中 download 为下载文件 参数说明 这里主要看你把 destFileName 下载文件名称定义为什么后缀,比如我定义为 .mp4 下…

What is load balancing? 什么是负载均衡?

原文链接 What Is Load Balancing? | IBM 什么是负载均衡? 在多台服务器之间高效的分配网络流量的过程,以优化应用程序的可用性,同时确保积极的用户体验。 电商网站依赖负载均衡(load balancing)来确保web应用能够无…

黑马商城微服务复习(6)

MQ高级 1. 消息可靠性2. 发送者的可靠性1. 发送者问题2. 生产者重试机制3. 生产者确认机制4. MQ可靠性5. 消费者的可靠性 3. 延迟消息1. 定义2. 死信交换机 1. 消息可靠性 发送消息时丢失: 生产者发送消息时连接MQ失败生产者发送消息到达MQ后未找到Exchange生产者发…

内网是如何访问到互联网的(华为源NAT)

私网地址如何能够访问到公网的? 在上一篇中,我们用任意一个内网的终端都能访问到百度的服务器,但是这是我们在互联网设备上面做了回程路由才实现的,在实际中,之前也说过运营商是不会写任何路由过来的,那对于…

oracle归档模式下的快速热备方法-适合小库

在我们的一些小型的oracle生产库中,有些时候我们可以在不停库且不使用rman的情况下实现数据库的热备。该热备的原理是通过控制数据文件块头的scn号在备份时候不变化,进而保证备份的数据文件数据一致性。 一、环境 数据库版本: 数据库需要开启…

rabbitMq举例

新来个技术总监,把 RabbitMQ 讲的那叫一个透彻,佩服! 生产者 代码举例 public String sendMsg(final String exchangeName,final String routingKey,final String msg) {} /*** 发送消息* param exchangeName exchangeName* param routin…

2024年12月13日Github流行趋势

项目名称:nexus-xyz / nexus-zkvm 项目维护者:govereau slumber danielmarinq sjudson yoichi-nexus项目介绍:Nexus zkVM 是一个零知识虚拟机。项目star数:1,948项目fork数:343 项目名称:soxoj / maigret …

(九)机器学习 - 多项式回归

多项式回归(Polynomial Regression)是一种回归分析方法,它将自变量 xx 和因变量 yy 之间的关系建模为 nn 次多项式。多项式回归的目的是找到一个 nn 次多项式函数,使得这个函数能够最好地拟合给定的数据点。 多项式回归的数学表达…

Linux USB开发整理和随笔

目录 1 概述 2 硬件原理基础 2.1 USB发展 2.2 USB的拓扑 2.3 硬件接口 2.4 USB总线协议 2.4.1 通信过程 2.4.2 概念关系 2.4.3 管道PIPE 2.4.4 传输 2.4.5 事务 2.4.6 包结构与类型 2.4.6.1 令牌包 2.4.6.2 数据包 2.4.6.3 握手包 2.5 描述符 2.5.1 设备描述符…

️️️ 避坑指南:如何修复国密gmssl 库填充问题并提炼优秀加密实践20241212

🛡️ 避坑指南:如何修复国密gmssl 库填充问题并提炼优秀加密实践 ✨ 引言 在当下的数据安全环境中,SM4作为中国国家密码算法的代表性选择,被广泛应用于金融、通信和政府领域。然而,在实际开发中,即便是开…