JS原型及原型链

news2025/7/19 3:44:18

欢迎来到“雪碧聊技术”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 = id
    this.name = name
    this.eat = function(){
        console.log('人吃饭')
    }
}

//自定义Teacher构造函数
function Teacher(edu){
    this.edu = edu
    this.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 = id
    this.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 = id
    this.name = name
    this.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 = id
    this.name = name
    this.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.coloradmin.cn/o/2260014.html

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

相关文章

常见的汽车前灯方案

文章目录 1.前言2.前灯方案需求概述3.传统前灯方案3.1 方案描述3.2 常用芯片 4.智能前灯控制器方案4.1 方案描述4.2 常用芯片 5.投影灯方案5.1 DLP5.2 MicroLED模组5.2.1 方案描述5.2.2 常用芯片 1.前言 自从上次分享了汽车贯穿式尾灯之后,也有很多读者发私信咨询汽…

队列+宽搜_429. N 叉树的层序遍历_二叉树最大宽度

429. N 叉树的层序遍历 定义一个队列q,将一层的节点入队,并记录节点个数。根据节点的个数,出队列,并将其孩子入队列。出完队列,队列当前剩余节点的个数就是下次出队列的次数。直到队列为空 /* // Definition for a Nod…

深度剖析 ToF 技术:原理、优劣、数据纠错与工业应用全解析

1 引言 飞行时间(Time-of-Flight,简称ToF)技术是一种先进的三维成像技术,其工作机制与三维激光扫描技术有着相似之处。ToF技术的主要优势在于其能够一次性捕获整个场景的深度信息,而不是通过逐点扫描的方式来获取&…

嵌入式硬件-- 元器件焊接

1.锡膏的使用 锡膏要保存在冰箱里。 焊接排线端子;138度的低温锡(锡膏), 第一次使用,直接拿东西挑一点涂在引脚上,不知道多少合适,加热台加热到260左右,放在上面观察锡融化&#…

一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测

一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测 目录 一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现INFO-CNN-SVM向量加权算法优化卷积神经网络结…

给新ubuntu电脑配置远程控制环境和c++版本的opencv环境

目录 改用户密码安装ssh sever安装net-tools配置vscode安装vim配置C opencv1. 安装g, cmake, make2.安装opencv依赖库3.下载opencv源文件(1)方法一:官网下载(2)方法二:GitHub下载方式: 4. Cmake…

(3)spring security - 认识PasswordEncoder

目录 1.简介1.1.简单了解认证流程 2.密码验证3.PasswordEncoder的内置实现4.小结 目标: 简单了解认证的流程简单认识spring security中的Password Encoder 1.简介 还是以这幅图为基础,认识Password Encoder到底是什么? 1.1.简单了解认证流程…

29.在Vue 3中使用OpenLayers读取WKB数据并显示图形

在Web开发中,地理信息系统(GIS)应用越来越重要,尤其是在地图展示和空间数据分析的场景中。OpenLayers作为一个强大的开源JavaScript库,为开发者提供了丰富的地图展示和空间数据处理能力。在本篇文章中,我将…

LLM大语言模型私有化部署-OpenEuler22.03SP3上容器化部署Dify与Qwen2.5

背景 Dify 是一款开源的大语言模型(LLM) 应用开发平台。其直观的界面结合了 AI 工作流、 RAG 管道、 Agent 、模型管理、可观测性功能等,让您可以快速从原型到生产。相比 LangChain 这类有着锤子、钉子的工具箱开发库, Dify 提供了更接近生产需要的完整…

革新3D高保真数字人生成:无需深度摄像头,普通手机视频即可创建逼真面部动画

在数字化内容创作领域,特别是虚拟人物和增强现实(AR)应用中,高质量的3D数字人生成正变得越来越重要。然而,传统方法依赖于昂贵的深度摄像头和复杂的设备设置,这不仅增加了成本,也限制了其灵活性和易用性。为了解决这些问题,并降低进入门槛,一款基于MetaHuman的插件应运…

【前端 Uniapp】使用Vant打造Uniapp项目(避坑版)

一、基本介绍 Uniapp 是基于 Vue.js 的开发框架,通过一套代码可以同时发布到多个平台的应用框架。而 Vant 是针对移动端 Vue.js 的组件库。通过这样的组合,我们可以快速构建出一个跨平台的移动应用。Vant 已经支持多种小程序和 H5 平台,也对…

【记录】Django解决与VUE跨域问题

1 梗概 这里记录Django与VUE的跨域问题解决方法,主要修改内容是在 Django 中。当然其他的前端项目 Django 也可以这样处理。 2 安装辅助包 pip install django-cors-headers3 配置 settings.py INSTALLED_APPS [ # ... corsheaders, # ... ] 为了响应…

【AI知识】激活函数介绍(sigmoid Tanh Relu)+ 梯度爆炸 / 消失及解决办法

激活函数: 使用激活函数的原因: 神经网络中每一层的输入输出都是一个线性求和的过程,下一层的输出只是承接了上一层输入函数的线性变换,如果没有激活函数,无论构造的神经网络多么复杂,有多少层,…

驱动开发-入门【1】

1.内核下载地址 Linux内核源码的官方网站为https://www.kernel.org/,可以在该网站下载最新的Linux内核源码。进入该网站之后如下图所示: 从上图可以看到多个版本的内核分支,分别为主线版本(mainline)、稳定版本&#…

3D 生成重建038-DiffGS训练一个3DGS编码器来简化训练

3D 生成重建038-DiffGS训练一个3DGS编码器来简化训练 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 三维高斯溅射(3DGS)在渲染速度和保真度方面表现出了令人信服的性能,但由于其离散性和非结构性,高斯溅射的生成仍然是一…

【渗透测试一】信息收集

信息收集简介 定义 信息收集是渗透测试和网络安全评估等活动的初始关键阶段。它是指通过各种合法手段(如网络扫描、查询公开数据库、社会工程学等),收集与目标系统(包括网络、主机、应用程序、组织等)相关的信息&…

小迪笔记第五十一天-前后台功能点文件下载文件读取文件删除目录遍历目录穿越

前言 前后台功能点 就是因为权限的不同而造成的 功能的不同 一般这个文件的 下载 文件的读取 一般出现在前台 而人家的删除和遍历 目录的穿越出现在 后台 以这个海洋cms 为例进行 演示 (源码在后台) 后台管理地址:http://192.168…

「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门

本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。 关键词 小学奥数Python Cangjie动态规划斐波那契数列 一、题目描述 …

phidata - 具有记忆、知识、工具和推理能力的多模态代理

Phidata 是一个用于构建多模态代理的框架,使用 phidata 可以:使用内存、知识、工具和推理构建多模式代理。建立可以协同工作解决问题的代理团队。使用漂亮的 Agent UI 与您的代理聊天。 16200 Stars 2200 Forks 28 Issues 82 贡献者 MPL-2.0 License Pyt…

第六届全球校园人工智能算法精英大赛-算法巅峰专项赛(系列文章)-- 开篇

前言 “全球校园人工智能算法精英大赛”是江苏省人工智能学会举办的面向全球具有正式学籍的全日制高等院校及以上在校学生举办的算法竞赛。其中的算法巅峰专项赛是新赛道,2024年是其第一届比赛。 翻阅过所有赛道的题目,题目出的真心可以,很具…