当前位置: 首页 > news >正文

深入理解JavaScript 的原型继承

JavaScript 的原型链继承机制和 Java 的类继承机制有明显的区别,虽然它们都用于实现对象之间的继承,但它们的实现方式、概念以及运行机制都不同。

1. JavaScript 的原型继承

JavaScript 是基于原型链的继承,主要依赖对象的 __proto__ 属性或 prototype 属性来实现对象的继承。以下是主要特点:

  • 对象的继承:JavaScript 中所有对象都有一个隐藏的 __proto__ 属性,它指向该对象的构造函数的 prototype 对象。通过这个原型链机制,JavaScript 实现了对象的继承。
  • 构造函数与原型对象:在 JavaScript 中,每一个函数都有一个 prototype 属性,指向一个对象(通常称为“原型对象”)。实例对象通过 __proto__ 链接到构造函数的 prototype 对象,从而实现继承。
  • 动态性:由于原型是一个对象,JavaScript 允许在运行时对原型对象进行修改,所有引用该原型的对象都将反映出这些修改。这使得 JavaScript 的继承机制非常灵活。

例如:

function Animal(name) {this.name = name;
}
Animal.prototype.speak = function() {console.log(this.name + ' makes a sound.');
};const dog = new Animal('Dog');
dog.speak(); // 输出: "Dog makes a sound."

在这里,dog 对象通过 __proto__ 链接到 Animal.prototype,从而继承了 speak 方法。

2. Java 的类继承

Java 使用类继承,基于类的定义和实例化。类继承的特点包括:

  • 类和对象的区分:Java 明确区分类和对象。类是模板,定义对象的结构和行为,而对象是类的实例。类的继承通过 extends 关键字实现。
  • 单继承:Java 不支持多继承(一个类只能继承一个父类),但可以通过接口来实现多态性和某种形式的多继承。
  • 静态类型检查:Java 是强类型语言,继承关系在编译时被检查。在 Java 中,继承的结构在编译时就已经确定,不能像 JavaScript 那样动态修改。
  • 方法重载与重写:Java 允许子类通过**方法重写(override)修改从父类继承的方法,或者通过方法重载(overload)**提供不同签名的同名方法。

例如:

class Animal {String name;Animal(String name) {this.name = name;}void speak() {System.out.println(name + " makes a sound.");}
}class Dog extends Animal {Dog(String name) {super(name);}@Overridevoid speak() {System.out.println(name + " barks.");}
}public class Main {public static void main(String[] args) {Dog dog = new Dog("Dog");dog.speak(); // 输出: "Dog barks."}
}

在这里,Dog 类继承了 Animal 类,并通过方法重写修改了 speak 方法的行为。

3. JavaScript 原型继承 vs Java 类继承

特性JavaScript 原型继承Java 类继承
继承方式基于对象的原型链 (__proto__)基于类的继承 (extends)
类的存在没有真正的类,使用函数构造对象明确的类定义
对象与类的区别不区分类和对象,类本质上也是函数明确区分类和对象
继承的灵活性运行时可以动态修改原型,所有实例立即反映修改继承关系在编译时确定,继承结构不可在运行时改变
多继承通过原型链可以实现某种形式的多继承不支持类的多继承,但可以通过接口实现
静态类型检查动态类型,继承关系和属性在运行时确定静态类型检查,继承关系在编译时确定
继承的结构对象链通过 __proto__ 连接,形成链式结构明确的层级关系,通过类的继承结构定义

4. 总结

  • JavaScript 使用基于原型的动态继承,这种继承方式较为灵活,允许对象在运行时进行修改。
  • Java 则使用基于类的继承,强调类型的严格检查,继承关系在编译时就确定,更加稳固且结构清晰。

这两种继承机制适应不同的编程范式,JavaScript 更灵活,而 Java 更加严谨。

相关文章:

深入理解JavaScript 的原型继承

JavaScript 的原型链继承机制和 Java 的类继承机制有明显的区别,虽然它们都用于实现对象之间的继承,但它们的实现方式、概念以及运行机制都不同。 1. JavaScript 的原型继承 JavaScript 是基于原型链的继承,主要依赖对象的 __proto__ 属性或…...

Error while loading conda entry point: conda-libmamba-solver

问题 解决方法 conda install --solverclassic conda-forge::conda-libmamba-solver conda-forge::libmamba conda-forge::libmambapy conda-forge::libarchive...

FANUC机器人—PCDK

前言 FANUC提供了一种使用其 PC 开发人员套件 (PCDK) 从 PC 命令和配置机器人的简单方法。该套件允许 PC 访问机器人上的变量、寄存器、IO、程序、位置和警报;接下来,我将如何开始使用 C#。 连接到机器人 将以下突出显示的行添加…...

如何在wsl中使用beyond compare

寫一個名為bc4的文件,內容如下: #!/bin/sh /mnt/c/Program\ Files/Beyond\ Compare\ 4/BComp.com $(wslpath -aw $1) $(wslpath -aw $2)bc4 file1 file2參考:https://forum.scootersoftware.com/forum/beyond-compare-4-discussion/version-…...

CNN+Transformer在自然语言处理中的具体应用

在自然语言处理(NLP)领域,CNN(卷积神经网络)和Transformer架构各自有着广泛的应用。NLP中的具体应用: CNN在NLP中的应用 1.文本分类:CNN可以用于文本分类任务,如情感分析、垃圾邮件…...

DotNetty ChannelRead接收数据为null

问题:C#使用Dotnetty和Java netty服务器通讯,结果能正确发送数据到服务器,却始终接收不到服务器返回的数据。 解决:一定一定要注意服务器和客户端使用的编码一定要完全一样才行 我先前在客户端添加了StringDecoder,服务器却没有…...

3分钟学会下载 blender

1. blender简介 Blender是一款开源的3D创作套件,它由Blender Foundation维护,并得到了全球志愿者和专业开发者的支持。Blender广泛应用于3D模型的制作、动画、渲染、视频编辑、游戏创建、模拟、 composting以及3D打印等多个领域。 功能特点&#xff1a…...

实现Xshell与虚拟机中Linux服务器的连接(附常见错误解决)

前言 Xshell是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 本文将介绍Xshell与虚拟机中Linux服务器连接…...

Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)

文章目录 esp-rs 简介GithubRust 包仓库Rust 教程Wokwi 电子模拟器开发环境Rust 环境esp-rs 环境创建 ESP32C3 项目项目结构编译项目命令运行模拟器ESP32C3 烧录 esp-rs 简介 esp-rs 是一个专注于为 Espressif 系列芯片(如 ESP32、ESP32-S2、ESP32-C3 等&#xff0…...

项目-坦克大战笔记-墙体销毁以及人机销毁

在子弹撞到墙或者人机身上时会将碰撞到的墙体或者人机销毁 我们需要做到几点 检测子弹碰撞到的墙体或者人机将物体获取到 每帧遍历墙体列表与人机列表,检测被碰撞的墙,创建一个方法返回值为对应类型将被碰撞的物体返回出来 public static gudin wallp…...

硬件设计-利用环路设计优化PLL的输出性能

目录 前言 问题描述 问题分析步骤 杂散源头排查 245.76M 参考相噪: 30.72M VCXO的相噪性能测试如下: 解决方案 前言 LMK04832是TI 新发布的低抖动双环去抖模拟时钟, 其最高输出频率可以到达3250MHz, 输出抖动极低,3200MHz…...

Vue入门-Node.js安装

进入Node.js中文网 ​​​​​​​点击进入Node.js中文网 或者手动输入网址: https://www.nodejs.com.cn/download.html 点击下载64位安装包: 下载好之后双击进行安装 可选择个性化安装或默认安装 直接点【Next】按钮,此处可根据个人需求…...

OpenCV threhold()函数

OpenCV threhold()函数的主要用途是将灰度图转换为二值图像,实现灰度图的二值化,在机器视觉中使用频度较高,如尺寸量测,物体识别等。其原型如下: 函数参数: src 输入数组(多通道、8 位或 32 位浮点&#xf…...

Qt教程(002):Qt项目创建于框架介绍

二、创建Qt项目 2.1 创建项目 【1、New Project】 【2、选择Qt Widgets Application】 【3、设置项目名称和保存路径】 注意,项目名称和路径不要带中文。 【4、选择QWidget】 带菜单栏的窗口QMainWindow空白窗口QWidget对话框窗口QDialog 【5、编译】 2.2 项目框…...

《C++游戏人工智能开发:开启智能游戏新纪元》

在当今的游戏世界中,人工智能(AI)已经成为了不可或缺的一部分。它能够为游戏增添深度、挑战性和真实感,让玩家沉浸其中,享受前所未有的游戏体验。而对于 C开发者来说,如何在 C中实现高效的游戏人工智能开发…...

SPSS and Origin Paired Samples T-Test

SPSS https://www.spss-tutorials.com/spss-paired-samples-t-test/ Testing the Normality Assumption We can now test the normality assumption by running a Shapiro-Wilk test ora Kolmogorov-Smirnov test. Origin分析 两个软件计算的一样...

速成java记录(上)

简单学一下,要求不高,能看懂java代码就行。 (太不容易了,已经好久没写博客了,希望以后可以坚持) /*** 文档注释* Author zmj* Data 2024/10/5 15:46 下午* Version 1.0*/import java.util.Scanner;//输入…...

春秋云镜靶场之CVE-2022-28525

1.环境搭建 我们开启环境 可以看到题目提示我们是文件上传漏洞,那么我们就进行测试 2.开启环境 我们开启环境,可以看到是一个登录页面,登录页面:一种是弱口令,一种是自己进行注册,一种是SQL注入,一种是在…...

【LLM】Agent在智能客服的实践(AI agent、记忆、快捷回复 | ReAct)

note 内容概况:结合京粉app学习agent的实践 Agent架构:通过模型训练提升LLM识别工具的准确性;设计可扩展并安全可控的agent架构扩展业务能力。记忆:多轮对话应用中如何组织、存储和检索记忆来提升大模型对用户的理解。快捷回复&…...

19款奔驰E300升级新款触摸屏人机交互系统

《19 款奔驰 E300 的科技焕新之旅》 在汽车科技日新月异的时代,19 款奔驰 E300 的车主们为了追求更卓越的驾驶体验,纷纷选择对爱车进行升级改装,其中新款触摸屏人机交互系统的改装成为了热门之选。 19 款奔驰 E300 作为一款经典车型&#x…...

Python知识点:如何使用Spark与PySpark进行分布式数据处理

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! Apache Spark 是一个强大的分布式数据处理系统,而 PySpark 是 Spark …...

低功耗4G模组Air780E之串口通信篇

你对低功耗4G模组Air780E有多少了解? 今天我们来讲解低功耗4G模组Air780E的串口通信的基本用法,小伙伴们,学起来吧! 一、硬件准备 780E开发板一套,包括天线、USB数据线。 USB转TTL工具或线(例如ch340、…...

Python | Leetcode Python题解之第455题分发饼干

题目&#xff1a; 题解&#xff1a; class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m, n len(g), len(s)i j count 0while i < m and j < n:while j < n and g[i] > s[j]:j 1if j < n:count 1i …...

交叠型双重差分法

交叠型双重差分法&#xff08;Staggered Difference-in-Differences, Staggered DiD&#xff09;是一种扩展的双重差分&#xff08;Difference-in-Differences, DiD&#xff09;方法&#xff0c;用于处理多个时间点的政策干预或处理组&#xff08;treatment group&#xff09;并…...

Java中的数据合并与拆分:使用Stream API实现数据的灵活处理

Java中的数据合并与拆分&#xff1a;使用Stream API实现数据的灵活处理 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在Java开发中&#xff0c;数据处理是最基础的操作之一&#xff0c;而在面对…...

Arthas(阿尔萨斯)

Arthas Arthas可以为你做什么&#xff1f; 安装下载 //Linux环境下 wget https://alibaba.github.io/arthas/arthas-boot.jar //Windows环境下可以直接去官网下载压缩包 https://arthas.aliyun.com/doc/download.html//启动命令 java -jar arthas-boot.jar 启动阿尔萨斯&#…...

黑马linux笔记(转载)

学习链接 视频链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通 原文链接&#xff1a;黑马程序员新版Linux零基础快速入门到精通——学习笔记 黑马Linux笔记 文章目录 学习链接01初识Linux1.1、操作系统概述1.1.1、硬件和软件1.1.2、操作系统1.1.3、常见操作系统 1.…...

SQL Server—通配符(模糊查询)详解

SQL Server—通配符(模糊查询)详解 在SQL Server中&#xff0c;通配符是一种特殊的符号&#xff0c;用于在LIKE运算符中搜索模式。SQL Server支持三种通配符&#xff1a;百分号&#xff08;%&#xff09;&#xff0c;下划线&#xff08;_&#xff09;和方括号&#xff08;[]&am…...

软考系统分析师知识点二:经济管理

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;35天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…...

C语言自定义类型联合和枚举(25)

文章目录 前言一、联合体联合体的声明联合体的特点联合体和结构体内存布局对比联合体的大小计算联合体的实际使用样例礼品兑换单判断当前机器是大端还是小端 二、枚举枚举的定义枚举类型的声明枚举类型的优点枚举类型的使用 总结 前言 关于自定义类型除了我们常用的结构体&…...