javascript中使用class和prototype的区别

news2024/12/23 8:59:28

javascript中使用class和prototype的区别

本文将介绍在 JavaScript 何时使用class以及何时使用prototype

prototype

首先先介绍一下prototype的概念,在Javascript中,所有的对象都从原型中继承属性和方法。

function Car(brand, vinNumber) {
    this.brand = brand;
    this.vinNumber = vinNumber;
}

Car.prototype.carInfo = function() {
    return {
        brand: this.brand,
        vinNumber: this.vinNumber
    }
}

在创建了上面的Car对象后,就可以使用以下的方式创建一个实例:

const byd = new Car('byd', 'qwuiqbasunqwidn123123');

创建了一个byd实例后,就可以调用carInfo这个方法:

console.log(byd.carInfo());

在这里插入图片描述

在这种情况下我们还可以通过call或者apaply方法来扩展Car对象来实现不同类型的车辆。

function SportUtilityCar(brand, vinNumber, drivetrain) {
    Car.call(this, brand, vinNumber);
    this.drivetrain = drivetrain;
}

现在,我们就可以创建一个SportUtilityCar的实例而非Car

const byd = new SportUtilityCar('byd', 'qwuiqbasunqwidn123123', 'AWD');

而且我们还可以通过原型为SportUtilityCar定义一个新版本的carInfo方法。

SportUtilityCar.prototype.carInfo = function() {
    return {
        brand: this.brand,
        vinNumber: this.vinNumber,
        drivetrain: this.drivetrain
    }
}

调用新版本的carInfo方法:

console.log(byd.carInfo());

在这里插入图片描述

class

ECMAScript 2015js推出了class这个概念。引入class的目标是允许使用更简单、更干净的语法创建类。事实上,class只是一个“语法糖”,以使开发人员能更容易编写代码。

将前面用prototype实现的代码转换成class

class Car {
    constructor(brand, vinNumber) {
        this.brand = brand;
        this.vinNumber = vinNumber;
    }
    carInfo() {
        return {
            brand: this.brand,
            vinNumber: this.vinNumber
        }
    }
}

class SportUtilityCar extends Car {
    constructor(brand, vinNumber, drivetrain) {
        super(brand, vinNumber);
        this.drivetrain = drivetrain;
    }
    carInfo() {
        return {
            brand: this.brand,
            vinNumber: this.vinNumber,
            drivetrain: this.drivetrain
        }
    }
}

如果我们需要在类中添加 gettersetter,可以通过以下写法。

class SportUtilityCar extends Car {
    constructor(brand, vinNumber, drivetrain) {
        super(brand, vinNumber);
        this.drivetrain = drivetrain;
    }
    carInfo() {
        return {
            brand: this.brand,
            vinNumber: this.vinNumber,
            drivetrain: this.drivetrain
        }
    }
    get drivetrain() {
        return this._drivetrain;
    }
    set drivetrain(newDrivetrain) {
        this._drivetrain = newDrivetrain;
    }
}

class的语法类似于 JavaC# 等语言。class方法允许不通过 Object.prototype 语法而为原型链添加属性和方法。

class 与 prototype 对比

如上所述,JavaScript 中的类只是语法糖,虽然这种方法允许那些来自JavaC#C++等语言的人也可以更加快速的上手javascript,但许多Javascript纯粹主义者建议不要使用类。

例如,Michael Krasnov在Please stop using classes in JavaScript文章中提到一个问题:

Binding issues. As class constructor functions deal closely with this keyword, it can introduce potential binding issues, especially if you try to pass your class method as a callback to an external routine.
翻译: 绑定问题。由于类构造函数密切处理此关键字,因此可能会引入潜在的绑定问题,尤其是在尝试将类方法作为回调传递给外部程序时。

当谈到在 JavaScript 中使用类或原型时,我觉得这是一个应该由支持和维护代码库的团队做出的决定。如果他们习惯于原型写法,那么就应该合理设计他们的组件。但是,如果偏好是利用class概念,则该团队的开发人员应该了解上述绑定挑战,但应该继续保持在他们的编程习惯。

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

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

相关文章

实现 Rollup 插件alias 并使用vitest提高开发效率

本篇文章是对 实现 Rollup 插件 alias | 使用 TypeScript 实现库的基本流程 | 使用单元测试提高开发效率 的总结。其中涉及到开发一个组件库的诸多知识点。 实现一个经常用的 rollup 插件 alias 首先执行npm init命令初始化一个package.json文件,因为插件使用了ty…

【大模型】ChatGLM2-6B 快速使用

教程 Bilibili:清华开源ChatGLM2-6B安装使用 手把手教程,轻松掌握 代码:https://github.com/THUDM/ChatGLM2-6B 模型:https://huggingface.co/THUDM/chatglm2-6b、https://cloud.tsinghua.edu.cn/d/674208019e314311ab5c/?p%2Fc…

【Java从入门到大牛】面向对象进阶下篇

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Java从入门到大牛 🌠 首发时间:2023年7月19日 🦋 欢迎关注🖱点赞👍收藏🌟留言&#x1f43…

vue3后台管理系统封装的普通搜索框组件

1.普通搜索框效果 代码&#xff1a;SearchItem.vue <template><div class"searchBox" id"searchBox"><!-- <a-form ref"formRef" name"advanced_search" class"ant-advanced-search-form" :model"f…

【笔记MD】

https://editor.csdn.net/md/?not_checkout1&articleId131798584 这里写自定义目录标题 https://editor.csdn.net/md/?not_checkout1&articleId131798584欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入…

基于PaddleOCR与OpenVINO™的结构化输出Pipeline

飞桨&#xff08;PaddlePaddle&#xff09;是百度自主研发的中国首个开源开放、功能丰富的产业级深度学习平台&#xff0c;以百度多年的深度学习技术研究和业务应用为基础。飞桨深度学习平台集核心框架、基础模型库、端到端开发套件、丰富的工具组件于一体&#xff0c;还包括了…

QGIS绘制一张地图——创建和编辑绘制线要素、由线要素生成面要素、面要素的编辑

前言 我们以描绘北京市市区案例来演示这部分功能。步骤大致如下: 1、按照市区分区的分界线来绘制线要素。 2、根据所绘线要素生成面要素。 3、对生成的面要素做整理编辑。待绘制底图如图所示: 一、创建和编辑绘制线要素 1.1 创建线要素 我们点击新建Shapefile要素按钮,…

ES6——Iterator 和 for...of 循环

Iterator:遍历器 是一接口&#xff0c;为不同的数据结构提供统一的访问机制&#xff0c;只要当前数据结构部署了iterator接口&#xff0c;当前数据结构就可以遍历。 作用&#xff1a;1、为不同的数据结构&#xff0c;提供统一的访问机制 2、使当前数据结构的成员依次被访问 3…

园区数字经济腾飞,先要长出“网络双翼”

没有人会否认&#xff0c;过去四十多年来&#xff0c;中国经济的腾飞&#xff0c;在全球发展史中写下了浓墨重彩的一笔。其中&#xff0c;产业园区有着不可替代的作用。有人说&#xff0c;园区的四十年&#xff0c;也是一部中国经济的演进史。 作为距离企业业务最近的网络层级&…

牛客网:华为机试刷题记录

牛客网&#xff1a;华为机试刷题记录 前言一、HJ15 求int型正整数在内存中存储时1的个数二、HJ10 字符个数统计三、HJ8 合并表记录四、HJ17 坐标移动五、HJ19 简单错误记录 前言 本文主要是想记录一下华为机试刷题过程中的总结 牛客网的华为机试链接&#xff1a;https://www.n…

通达信超级分时主图指标公式_通达信公式

{日引用} MA3:MA(C,3); MA5:MA(C,5); MA7:MA(C,7); MA10:MA(C,10); MA21:MA(C,21); {BBIYY} DKX:(MA(C,3)MA(C,6)MA(C,12)MA(C,24))/4; {LJFSYY} H1:REF(H,1); L1:REF(L,1); {大盘分时主图} SJ:IF(HOUR<12,(HOUR-9.5)*60MINUTE,(HOUR-11)*60MINUTE); F:DYNAINFO(3)…

J-Flash烧录工具如何添加新的芯片类型

0 Preface/Foreword 1 添加方法 1.1 修改JLinkDevices.xm <!-- --> <!-- CMS --> <!-- --> <Device> <ChipInfo Vendor"CMS32" Name"CMS32L051" Core"JLINK_CORE_CORTEX_…

2023年7月江苏/北京/深圳CDGA/CDGP数据治理认证招生

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

Claude API接口调用配置方法和脚本

直接通过API调用Claude方法&#xff0c;这个已经应用到一键成片AI绘画软件中。对于GPT来说速度慢了一点但是还能接受和GPT35差不多&#xff0c;最重要的是不花钱。 先来看我在项目中的应用把。 创建Slack工作台 slack注册网址&#xff0c;请使用谷歌邮箱&#xff0c;点击登…

自洽性改善语言模型中的思维链推理7.13、7.14

自洽性改善语言模型中的思维链推理 摘要介绍对多样化路径的自洽实验实验设置主要结果当CoT影响效率时候&#xff0c;SC会有所帮助与现有方法进行比较附加研究 相关工作总结 原文&#xff1a; 摘要 本篇论文提出了一种新的编码策略——自洽性&#xff0c;来替换思维链中使用的…

Vue3中的透传Attributes / $attrs:简化组件开发的利器

前言 Vue3推出了一系列新功能和改进。使用下来后&#xff0c;其中一个很实用的新特性就是透传 Attributes&#xff08;透传属性&#xff09;。本文将介绍 Vue3中的透传 Attributes&#xff0c;并提结合代码示例来展示它在实际项目中的使用。 一、什么是透传 Attributes&#x…

多网点多设备的动环机房都怎样集中管理的呢?

多机房动力环境集中监控系统针对分布不同区域、设备数量较多、减少人工巡检费用支出而设计的在线集中监控的系统平台。可用于分布式的UPS电源、精密空调、空气质量检测传感器、精密配电等设备的网络集中监控&#xff0c;通过TCP/IP网络&#xff0c;可以实时的跨地域的监控多台都…

四、DML-2.数据操作-修改

原数据表&#xff1a; 一、案例一 修改id为1的数据&#xff0c;将name修改为itheima update employee set name itheima where id 1; 步骤一&#xff1a;输入update命令并执行&#xff1a; 步骤二&#xff1a;刷新查看employee表修改后数据&#xff1a; 二、案例二 修改id为…

Beyond Compare 代码比较工具

一、下载 官网下载地址&#xff1a; https://www.scootersoftware.com/download.php 选择 Windows 系统&#xff0c;简体中文版本&#xff0c;点击下载。 下载完成 二、安装 步骤1&#xff1a;双击安装包 步骤2&#xff1a;进入安装向导&#xff0c;点击下一步 步骤3&a…

【Git合并代码操作】B=>A

【Git合并代码操作步骤】B>A 前提&#xff1a;之前写了Git合并代码A>B&#xff0c;今天把B>A再写一下&#xff0c;顺风车》》》》》》》》 【git合并代码操作步骤】A&#xff1e;B_痴心阿文的博客-CSDN博客 拉B最新代码 > 然后git merge A &#xff0c;有冲突解决冲…