当前位置: 首页 > 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…...

Linux 新手必会 30 个高频基础命令(零基础可直接上手)

前言对于Linux新手来说,无需死记硬背所有命令,重点掌握这30个高频基础命令,就能完成日常90%的操作(目录切换、文件管理、系统查看等)。本文按“使用场景分类”,每个命令标注【用法示例新手提示】&#xff0…...

CodeWave项目导出实战:从云端到本地的完整避坑指南(含数据库配置与端口冲突解决)

CodeWave项目导出实战:从云端到本地的完整避坑指南(含数据库配置与端口冲突解决) 当开发者完成CodeWave平台上的应用构建后,如何将项目顺利迁移至本地环境往往成为新的挑战。不同于云端的一键部署,本地化过程涉及环境差…...

企业信息化架构(业务架构、应用架构、数据架构、技术架构)方案:四横五纵框架 、元模型+视图 、业务、应用、数据、技术四大架构

该方案提出了企业信息化架构的“四横五纵”框架,涵盖业务、应用、数据、技术四大架构及架构管控,通过元模型定义元素关系,以多层级视图实现从战略到实施的可视化与落地,支撑企业架构全生命周期管理。 四横五纵框架清晰划分了企业架…...

避坑指南:用3dMax一键房屋插件时,为什么你的窗洞总创建失败?

3dMax一键房屋插件窗洞创建失败的深度排查手册 引言 在建筑可视化与室内设计领域,3dMax的一键房屋插件确实为设计师节省了大量重复劳动时间。然而,许多中级用户在尝试创建窗洞时,常常遭遇各种意料之外的失败——从简单的按钮灰色不可点击&…...

树莓派I2C保姆级教程:从命令行工具到Python脚本,一次搞定多个传感器(附避坑指南)

树莓派I2C实战指南:从硬件调试到Python自动化控制 第一次接触树莓派的I2C接口时,我对着密密麻麻的引脚和传感器数据手册发呆了半小时。直到成功读取到第一个温湿度数据,才意识到I2C这种看似复杂的通信协议,其实就像一位耐心的翻译…...

推荐五家SF6在线监测报警系统

在有六氟化硫气体存在的场所,如小区配电室、变电站、电厂等,SF6在线监测报警系统起着至关重要的作用。它能实时监测现场气体浓度,在浓度超标时第一时间发出报警信号,及时消除隐患。今天就为大家推荐五家SF6在线监测报警系统品牌&a…...

伊犁盛夏赴花海,霍城紫浪漫卷天山脚下

在新疆伊犁哈萨克自治州霍城县,天山北麓的缓坡地带铺展着国内规模最大的薰衣草种植区。每年夏季,这片土地被大面积的薰衣草覆盖,呈现出连绵的紫色景观。霍城与法国普罗旺斯、日本北海道富良野地处相近纬度,气候条件适宜薰衣草生长…...

双足机器人推进系统建模与系统辨识技术解析

1. 双足机器人推进系统建模与验证概述在机器人动力学控制领域,系统辨识是建立精确数学模型的关键技术。本文以美国东北大学开发的Harpy v2双足机器人为研究对象,重点探讨其集成推进系统的推力与扭矩特性建模方法。这款机器人高约1.2米,重15公…...

VScode搭建一体化ROS开发环境:从配置到调试的完整实践指南

1. 项目概述与核心价值最近在带几个新同事上手机器人项目,发现他们配置ROS开发环境时,总会在各种依赖、路径和编译问题上卡壳,一折腾就是大半天。这让我想起自己刚接触ROS那会儿,也是被环境配置搞得焦头烂额,明明照着官…...

【数字对调】信息学奥赛一本通C语言解法(题号2070)

自留or欢迎大佬纠错【题目描述】输入一个三位数&#xff0c;要求把这个数的百位数与个位数对调&#xff0c;输出对调后的数。【输入】三位数。【输出】如题述结果。【输入样例】123【输出样例】321#include<stdio.h> int main(){int a;scanf("%d",&a);int …...