JavaScript面向对象编程:Prototype与Class的对比详解

JavaScript面向对象编程:Prototype与Class的对比详解

  • JavaScript面向对象编程:Prototype与Class的对比详解
    • 引言
    • 什么是JavaScript的面向对象编程?
    • 什么是Prototype?
      • Prototype的定义
      • Prototype的工作原理
      • 示例代码
      • 优点
      • 缺点
    • 什么是JavaScript中的Class?
      • Class的定义
      • Class的工作原理
      • 示例代码
      • 优点
      • 缺点
    • Prototype与Class的主要区别
    • 实际应用中的对比
      • 情景一:简单继承
        • Prototype模式
        • Class模式
      • 情景二:动态扩展属性
        • Prototype模式
        • Class模式
      • 情景三:继承链
        • Prototype模式
        • Class模式
    • 性能对比
    • 选择使用哪种方式?
    • 总结

JavaScript面向对象编程:Prototype与Class的对比详解

在JavaScript中,面向对象编程(OOP)是实现复杂功能的核心技术之一。而JavaScript提供两种主要的方式来实现面向对象编程:
Prototype模式Class类语法糖。虽然它们都能实现类似的效果,但在语法、实现原理以及应用场景上存在显著差异。

本文将详细对比这两种方法的异同,并通过大量代码示例帮助开发者理解它们的区别及适用场景。


引言

JavaScript是一种基于原型的语言(Prototype-based language),这意味着它与传统的类式面向对象语言(如Java、C++等)在语法和实现原理上存在显著差异。尽管如此,为了简化面向对象编程的语法,ES6引入了class关键字,使得开发者可以使用更接近传统OO语言的方式编写代码。

本文将深入探讨Prototype模式Class类语法糖的区别,包括它们的定义、实现方式、优缺点以及适用场景。


什么是JavaScript的面向对象编程?

在JavaScript中,面向对象编程的核心思想是通过创建对象来封装属性和方法,并通过继承机制复用代码。以下是两种主要的实现方
式:

  1. 基于Prototype(原型)的方式:所有对象都继承自一个共同的原型对象。
  2. 基于Class的方式:ES6引入的一种更接近传统OO语言的语法糖,本质上仍然是基于原型的实现。

什么是Prototype?

Prototype的定义

在JavaScript中,prototype是面向对象编程的核心机制。每个函数都有一个prototype属性,该属性是一个对象(称为“原型对象”),用于存储与该函数相关的属性和方法。当通过构造函数创建新对象时,这些属性和方法会被继承到新对象上。

Prototype的工作原理

  1. 构造函数:使用new关键字调用一个构造函数会创建一个新的空对象,并将该对象的[[Prototype]]内部属性指向构造函数的prototype
  2. 原型链:JavaScript中的对象通过原型链继承属性和方法。当访问一个对象的属性时,如果该对象本身没有该属性,则会沿着原型链向上查找。

示例代码

// 定义构造函数
function Person(name, age) {this.name = name;this.age = age;
}// 在prototype上添加方法
Person.prototype.sayHello = function() {console.log(`Hello, my name is ${this.name}`);
};// 创建实例
const person1 = new Person('Alice', 25);
person1.sayHello(); // 输出 "Hello, my name is Alice"// 检查原型链
console.log(person1.__proto__ === Person.prototype); // true

优点

  • 灵活性:直接操作原型对象,可以在运行时动态地添加、删除或修改属性和方法。
  • 轻量级:不需要显式地定义类,语法简单。

缺点

  • 可维护性差:随着代码复杂度增加,直接操作原型链可能会导致难以维护的代码结构。
  • 不直观:对于习惯了传统OO语言的开发者来说,基于prototype的编程方式可能不够直观。

什么是JavaScript中的Class?

Class的定义

ES6引入了class关键字,使得JavaScript的面向对象编程语法更加接近传统的类式语言。尽管如此,class本质上仍然是对原型模式的一种语法糖(syntactic sugar)。

Class的工作原理

  1. 类的定义:通过class关键字定义一个类,并在类体内声明属性和方法。
  2. 构造函数:使用constructor()方法作为类的初始化逻辑。
  3. 实例化:通过new关键字创建类的实例,实例将继承类中的所有属性和方法。

示例代码

// 定义类
class Person {constructor(name, age) {this.name = name;this.age = age;}sayHello() {console.log(`Hello, my name is ${this.name}`);}
}// 创建实例
const person1 = new Person('Alice', 25);
person1.sayHello(); // 输出 "Hello, my name is Alice"

优点

  • 语法直观:与传统OO语言类似,更容易理解和维护。
  • 静态方法支持:可以通过static关键字定义静态方法。
  • 更清晰的继承机制:通过extendssuper关键字实现类的继承。

缺点

  • 灵活性较低:相对于prototype模式,class语法糖对运行时操作限制较多。
  • 性能影响:虽然差异微小,但在某些情况下可能会影响性能。

Prototype与Class的主要区别

特性Prototype模式Class(ES6)
定义方式通过函数的prototype属性通过class关键字
语法复杂度较低,直接操作对象较高,接近传统OO语言
方法定义位置在构造函数或原型链上在类体内
继承机制通过原型链实现继承通过extendssuper实现继承
静态方法支持需要手动将静态方法挂载到原型对象支持直接定义静态方法
语法糖原生语法,非语法糖ES6引入的语法糖
灵活性更高,可以在运行时动态修改较低,不支持在运行时重新定义类

实际应用中的对比

情景一:简单继承

Prototype模式
function Animal() {this.species = 'animal';
}Animal.prototype.eat = function() {console.log('Eating...');
};// 创建实例
const dog = new Animal();
dog.eat(); // 输出 "Eating..."
Class模式
class Animal {constructor() {this.species = 'animal';}eat() {console.log('Eating...');}
}// 创建实例
const dog = new Animal();
dog.eat(); // 输出 "Eating..."

情景二:动态扩展属性

Prototype模式
function Person(name) {this.name = name;
}Person.prototype.sayHello = function() {console.log(`Hello, ${this.name}`);
};// 在运行时添加新方法
Person.prototype.greeting = function() {console.log(`Greetings, ${this.name}`);
};const person1 = new Person('Alice');
person1.sayHello(); // "Hello, Alice"
person1.greeting(); // "Greetings, Alice"
Class模式
class Person {constructor(name) {this.name = name;}sayHello() {console.log(`Hello, ${this.name}`);}
}// 在运行时添加新方法(需要使用defineProperty或原型操作)
Object.defineProperty(Person.prototype, 'greeting', {value: function() { console.log(`Greetings, ${this.name}`); },enumerable: true,configurable: true
});const person1 = new Person('Alice');
person1.sayHello(); // "Hello, Alice"
person1.greeting(); // "Greetings, Alice"

情景三:继承链

Prototype模式
function Animal() {}
function Dog() {this.species = 'dog';
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.bark = function() { console.log('Barking...'); };const dog = new Dog();
dog.bark(); // "Barking..."
Class模式
class Animal {}
class Dog extends Animal {constructor() {super();this.species = 'dog';}bark() {console.log('Barking...');}
}const dog = new Dog();
dog.bark(); // "Barking..."

性能对比

  • 内存占用:两者在底层实现上差异不大,均依赖于JavaScript引擎的内部机制。
  • 运行时性能:对于简单的类和原型链操作,性能差异几乎可以忽略不计。
  • 维护成本:复杂的项目中,class更易维护。

选择使用哪种方式?

  • 如果需要高度动态的应用场景(例如在运行时频繁修改属性或方法),建议使用Prototype模式。
  • 如果追求代码的可读性和维护性,推荐使用Class语法糖。
  • 混合使用:可以根据具体需求灵活结合两种方式。

总结

  • Prototype模式是JavaScript的核心机制,适合需要动态操作和高度定制的应用场景。
  • Class语法糖提供了更直观、更接近传统OO语言的语法,适合大多数常规应用场景。
  • 两者各有优劣,选择哪种方式取决于具体项目需求和个人偏好。

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

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

相关文章

【Qt】Qt老版本解决中文乱码

修改Pro文件 Qt 老版本(Qt5 MSVC2017,其他版本的可以试一试)出现中文乱码,只要字符串中有中文就会乱码: 工具->选项->文本编辑器: 修改Pro文件 以上修改后若还乱码,则在项目中的 .pro 文件添加以…

【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型

摘要:我们推出了Sigma,这是一个专为系统领域设计的高效大型语言模型,其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构,并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询(Q&…

【人工智能】 在本地运行 DeepSeek 模型:Ollama 安装指南

持续更新。。。。。。。。。。。。。。。 【人工智能】 在本地运行 DeepSeek 模型:Ollama 安装指南 安装 Ollama安装 DeepSeek 模型选择版本 ,版本越高,参数越多 性能越好使用 DeepSeek 模型 安装 Ollama 访问 Ollama 官网: 前往 https://oll…

《基于Scapy的综合性网络扫描与通信工具集解析》

在网络管理和安全评估中,网络扫描和通信是两个至关重要的环节。Python 的 Scapy 库因其强大的网络数据包处理能力,成为开发和实现这些功能的理想工具。本文将介绍一个基于 Scapy 编写的 Python 脚本,该脚本集成了 ARP 扫描、端口扫描以及 TCP…

通信易懂唠唠SOME/IP——SOME/IP协议简介

一 简介 1.1 面向服务的中间件 SOME/IP是Scalable service-Oriented MiddlewarE over IP (SOME/IP)的缩写,基于IP的可扩展面向服务的中间件。 1.2 广泛应用于汽车嵌入式通信 SOME/IP是一种支持远程通信的汽车/嵌入式通信协议 。支持远程过程调用(RPC…

高温环境对电机性能的影响与LabVIEW应用

电机在高温环境下的性能可能受到多种因素的影响,尤其是对于持续工作和高负荷条件下的电机。高温会影响电机的效率、寿命以及可靠性,导致设备出现过热、绝缘损坏等问题。因此,在设计电机控制系统时,特别是在高温环境下,…

[SAP ABAP] SE11 / SE16N 修改标准表(慎用)

1.SE16N修改标准表 使用事务码ME16N进入到查询页面,填入要修改的标准表MARA,在事务码输入框中填入/H,回车之后点击按钮,进入Debug调试界面 把GD-SAPEDIT 与 GD-EDIT 的值更改为X然后点击按钮(快捷键按F8)进行下一步操作 可以在此…

小米CR6606,CR6608,CR6609 启用SSH和刷入OpenWRT 23.05.5

闲鱼上收了一台CR6606和一台CR6609, 一直没时间研究, 趁春节假期把这两个都刷成 OpenWRT 配置说明 CPU: MT7621AT,双核880MHz内存: NT5CC128M16JR-EKI 或 M15T2G16128A, 256MB闪存: F59L1G81MB, 128MB无线基带芯片(BB): T7905DAN无线射频芯片(RF): MT7975DN无外置F…

CSS(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中,所有事件都继承自 QEvent ,并且每个事件都有特定的标识符,如:Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…

Observability:实现 OpenTelemetry 原生可观察性的商业价值

作者:来自 Elastic David Hope 利用开放标准和简化的数据收集转变组织的可观察性策略。 现代组织面临着前所未有的可观察性挑战。随着系统变得越来越复杂和分散,传统的监控方法难以跟上步伐。由于数据量每两年翻一番,系统跨越多个云和技术&am…

deep generative model stanford lecture note2 --- autoregressive

1 Introduction 在note1 已经明确了生成模型,是通过概率分布来拟合数据,这个部分采用自回归的模型结构来拟合数据。主要任务包括:选择什么样的自回归模型结构和设计什么样的loss函数来让模型收敛。 自回归模型结构的理论基础还是贝叶斯概率结…

C++模板初了解

这节我们来学习一下C的一个便捷之处——模板 文章目录 一、泛型编程 泛型编程的基本思想 泛型编程的优点 泛型编程的应用 二、模板 函数模板 函数模板格式 函数模板的原理 函数模板的实例化 1.隐式实例化 2.显示实例化 函数模板的匹配原则 类模板 类模板的格式 类模板的实例化 …

PPT演示设置:插入音频同步切换播放时长计算

PPT中插入音频&同步切换&放时长计算 一、 插入音频及音频设置二、设置页面切换和音频同步三、播放时长计算 一、 插入音频及音频设置 1.插入音频:点击菜单栏插入-音频-选择PC上的音频(已存在的音频)或者录制音频(现场录制…

React

1. React 基础 1) 环境准备 创建项目 首先,通过 react 脚手架创建项目 npx create-react-app client --template typescriptclient 是项目名目前 react 版本是 18.x 运行项目 cd client npm start会自动打开浏览器,默认监听 3000 端口 修改端口 在…

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置

2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方,在空白处鼠标右键选择通过Code打开 打开Vscode,点击platformIO图标,选择PIO Home下的open,最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…

3、从langchain到rag

文章目录 本文介绍向量和向量数据库向量向量数据库 索引开始动手实现rag加载文档数据并建立索引将向量存放到向量数据库中检索生成构成一条链 本文介绍 从本节开始,有了上一节的langchain基础学习,接下来使用langchain实现一个rag应用,并稍微…

【自然语言处理(NLP)】基于Transformer架构的预训练语言模型:BERT 训练之数据集处理、训练代码实现

文章目录 介绍BERT 训练之数据集处理BERT 原理及模型代码实现数据集处理导包加载数据生成下一句预测任务的数据从段落中获取nsp数据生成遮蔽语言模型任务的数据从token中获取mlm数据将文本转换为预训练数据集创建Dataset加载WikiText-2数据集 BERT 训练代码实现导包加载数据构建…

41【文件名的编码规则】

我们在学习的过程中,写出数据或读取数据时需要考虑编码类型 火山采用:UTF-16 易语言采用:GBK php采用:UTF-8 那么我们写出的文件名应该是何种编码的?比如火山程序向本地写出一个“测试.txt”,理论上这个“测…

NLP深度学习 DAY4:Word2Vec详解:两种模式(CBOW与Skip-gram)

用稀疏向量表示文本,即所谓的词袋模型在 NLP 有着悠久的历史。正如上文中介绍的,早在 2001年就开始使用密集向量表示词或词嵌入。Mikolov等人在2013年提出的创新技术是通过去除隐藏层,逼近目标,进而使这些单词嵌入的训练更加高效。…