javascript中使用class和prototype的区别

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.hqwc.cn/news/29829.html

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

相关文章

音视频H265编码; Socket通信实现N对N连接代码示例

H.265编码和Socket通信是两个不同的概念,它们分别涉及视频编码和网络通信。在实现N对N连接时,您可以将它们结合起来,但要注意每个方面的具体实现。 H.265编码(视频编码): H.265编码涉及将视频数据进行压缩…

typescript manual

这里写目录标题 throw new Error在浏览器中调试Json定义类型定义数组 functionNamed functionanonymous function Axios经典片段 错误及解决ref valuebecause it is a constantAPI 和 客户端定义的数据结构不一样ServerClient throw new Error throw new Error(“Get data err…

Android应用启动全流程分析(源码深度剖析)

作者:努比亚技术团队 源码来源:努比亚技术团队 1.前言 从用户手指点击桌面上的应用图标到屏幕上显示出应用主Activity界面而完成应用启动,快的话往往都不需要一秒钟,但是这整个过程却是十分复杂的,其中涉及了Android系…

ngsoc使用指南

和威胁告警差不多。 ngsoc是以资产为核心,以安全事件为管理的关键流程,建立一套威胁检测,相应,预测,和持续监控分析,一体化的监控与相应平台。 和天眼的区别:会把天眼的告警,其他安…

基于阿里云微信小程序语音识别

页面效果 其中采用阿里云语音识别&#xff1a;阿里云一句话语音识别 语音识别页面 <template><view><view class"chat_list"><view v-for"v in chatList" :class"v.type right ? type_right : type_left"><chat …

React和Vue生命周期

主要就是命名不同 目录 React 组件挂载 挂载前constructor() 挂载时render() 挂载后componentDidMount()&#xff1a;初始化节点 更新 更新时render()&#xff1a;prop/state改变 更新后componentDidUpdate() 卸载 卸载前componentWillUnmount()&#xff1a;清理 V…

Microsoft Outlook如何定时发送邮件

点击New Emai 选择Options→Delay Delivery→Do not deliver before→Close

MySQL(六)主从复制

MySQL系列文章 MySQL&#xff08;一&#xff09;基本架构、SQL语句操作、试图 MySQL&#xff08;二&#xff09;索引原理以及优化 MySQL&#xff08;三&#xff09;SQL优化、Buffer pool、Change buffer MySQL&#xff08;四&#xff09;事务原理及分析 MySQL&#xff08;五&a…

HTML+CSS+JavaScript:渲染柱形统计图

一、需求 用户输入四个季度的数据&#xff0c;根据数据生成柱形统计图&#xff0c;浏览器预览效果如下 二、完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…

Jenkins | 获取凭证密码

目录 方法一&#xff1a;查看所有账号及密码 方法二&#xff1a;查看指定账号密码 方法一&#xff1a;查看所有账号及密码 Jenkins > 系统管理 > 脚本命令行 com.cloudbees.plugins.credentials.SystemCredentialsProvider.getInstance().getCredentials().forEach{i…

VoIP监控工具有什么作用

VoIP 监控工具利用思科的 IPSLA 技术生成合成流量并监控客户端体验的呼叫质量。与被动监控VoIP指标相反&#xff0c;IPSLA技术允许IT管理员主动并在潜在问题发生之前检测到它们&#xff0c;这使组织能够轻松遵守严格的SLA指标。 思科 IPSLA 技术在两台设备之间创建流量&#x…

gd32f103vbt6 串口OTA升级3-linux端的部分

一. 简介 本文主要是对linux端升级单片机程序的功能部分做一些介绍&#xff0c;包括一些软件流程。 二.硬件部分 2.1 rk3399cpugd32f103 2.2 连接方式&#xff1a;串口&#xff08;115200&#xff0c;8N1&#xff09;或者iic&#xff08;本文没有介绍iic&#xff09; 三、其…