JavaScript 原型与原型链:深入理解 __proto__ 和 prototype 的由来与关系

news2025/6/7 10:45:02

引言

在 JavaScript 的世界中,原型和原型链是理解这门语言面向对象编程(OOP)机制的核心。不同于传统的基于类的语言如 Java,JavaScript 采用了一种独特的原型继承机制。本文将深入探讨 __proto__ 和 prototype 的由来、关系以及它们在 JavaScript 中的作用。


一、JavaScript 的 OOP 机制

传统的面向对象编程语言(如 Java)具有类、继承、封装和多态等特性。JavaScript 虽然也支持 OOP,但其实现方式却大不相同。

1.1 没有类的 JavaScript

在 ES6 之前,JavaScript 并没有 class 关键字。为了实现类似类的功能,开发者通常使用构造函数和原型来模拟类的行为。例如:

// Java 中的类定义
public class Puppy {
    int puppyAge;
    public Puppy(int age) {
        puppyAge = age;
    }
    public void say() {
        System.out.println("汪汪汪");
    }
}

而在 JavaScript 中,我们通过函数来模拟类:

// JavaScript 中的构造函数模拟类
function Person(name, age) {
    this.name = name;
    this.age = age;
}

1.2 对象字面量的局限性

虽然可以通过对象字面量创建对象,但当需要创建多个相似对象时,这种方式显得非常繁琐:

var Person = {
    name: '吉他胡',
    hobbies: ['弹吉他', '弹钢琴'],
}

var pll = {
    name: '皮乐乐',
    hobbies: ['弹吉他', '弹钢琴'],
}

为了解决这个问题,JavaScript 引入了构造函数和原型的概念。


二、构造函数与原型

2.1 构造函数

构造函数是 JavaScript 中模拟类的关键。通过约定俗成,构造函数的名称首字母大写:

function Person(name, age) {
    this.name = name;
    this.age = age;
}

2.2 prototype 属性

每个函数都有一个 prototype 属性,它是一个对象,用于存储共享的属性和方法。通过将方法定义在 prototype 上,可以避免每次实例化对象时重复创建方法:

Person.prototype.sayHello = function() {
    console.log(`hello, my name is ${this.name}`);
}

2.3 __proto__ 属性

每个对象都有一个私有属性 __proto__,它指向构造函数的 prototype 对象。例如:

let hu = new Person('吉他胡', 18);
console.log(hu.__proto__ === Person.prototype); // true

__proto__ 是对象与构造函数之间的桥梁,也是原型链实现的基础。


三、原型链

3.1 原型链的概念

JavaScript 中的继承是通过原型链实现的。当访问一个对象的属性或方法时,如果对象本身没有该属性,JavaScript 会沿着 __proto__ 向上查找,直到找到该属性或到达原型链的顶端(Object.prototype),最终指向 null

console.log(hu.toString()); // 调用的是 Object.prototype.toString

3.2 修改原型链

__proto__ 可以动态修改,从而改变对象的原型链:

var a = {
    name: '孔子',
    country: '中国',
};
hu.__proto__ = a;
console.log(hu.country); // 输出:中国

3.3 原型链的终点

原型链的顶端是 Object.prototype,其 __proto__ 指向 null

console.log(Object.prototype.__proto__); // null

四、new 的过程

当我们使用 new 关键字创建对象时,JavaScript 会执行以下步骤:

  1. 创建一个空对象 {}
  2. 运行构造函数,并将 this 指向这个空对象。
  3. 将对象的 __proto__ 指向构造函数的 prototype
  4. 返回构造完成的对象。
let hu = new Person('吉他胡', 18);

五、prototype 与 __proto__ 的关系

  • prototype:是函数特有的属性,指向构造函数的原型对象。
  • __proto__ :是对象特有的属性,指向构造函数的 prototype 对象。

它们的关系可以用以下代码验证:

console.log(Person.prototype.constructor === Person); // true
console.log(hu.__proto__ === Person.prototype); // true

六、总结

  1. JavaScript 没有类,而是通过构造函数和原型模拟类的行为。
  2. prototype 是函数特有的属性,用于定义共享的属性和方法。
  3. __proto__  是对象特有的属性,用于构建原型链。
  4. 原型链 是 JavaScript 实现继承的机制,通过 __proto__ 向上查找属性和方法。
  5. new 关键字 通过构造函数创建对象,并建立原型链关系。

理解原型和原型链是掌握 JavaScript 面向对象编程的关键。虽然 ES6 引入了 class 语法,但其底层仍然是基于原型的实现。希望本文能帮助你更好地理解 JavaScript 的原型机制!

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

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

相关文章

光电耦合器:数字时代的隐形守护者

在数字化、自动化高速发展的今天,光电耦合器正以一种低调却不可或缺的方式,悄然改变着我们的生活。它不仅是电子电路中的“安全卫士”,更是连接信号世界的“桥梁”,凭借出色的电气隔离能力,为各类设备提供稳定可靠的信…

手机如何防止ip关联?3种低成本方案

在当今数字化时代,手机已成为人们日常生活中不可或缺的工具,无论是社交、购物、支付还是工作,都离不开手机。然而,随着网络技术的不断发展,网络安全问题也日益突出,其中IP关联问题尤为常见。那么&#xff0…

Pandas和Django的示例Demo

以下是一个结合Pandas和Django的示例Demo,展示如何在Django项目中读取、处理和展示Pandas数据。 Pandas和Django的示例Demo 前置条件: 安装python 基础设置 确保已安装Django和Pandas: pip install django pandasInstalling collected p…

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信拓扑与操作 BR/EDR(经典蓝牙)和 BLE

目录 1. BR/EDR(经典蓝牙)网络结构微微网(Piconet)散射网(Scatternet)蓝牙 BR/EDR 拓扑结构示意图 2. BLE(低功耗蓝牙)网络结构广播器与观察者(Broadcaster and Observer…

航道无人机巡检系统

随着长江干线、京杭运河等航道智慧化升级提速,传统人工巡检模式已难以满足高频次、大范围、高精度的航道管理需求。无人机凭借其灵活机动、多源感知、高效覆盖等优势,正成为航道巡检的“空中卫士”。本文将结合多地成功案例,从选型标准、技术…

【JVM】Java虚拟机(一)——内存结构

目录 一、简介 二、程序计数器 三、虚拟机栈 栈帧结构: 特点: 四、本地方法栈 特点: 五、堆 堆结构: 特点: 对象分配过程: 六、方法区 方法区结构: 特点: 运行时常量池…

从微积分到集合论(1630-1910)(历史简介)——第4章——现代积分理论的起源(Thomas Hawkins)

第 4 章 现代积分理论的起源 (The Origins of Modern Theories of Integration) Thomas Hawkins 目录 4.1 引言(Introduction) 4.2 Fourier分析与任意函数(Fourier analysis and arbitrary functions) 4.3 对Fourier问题的回应(Responses to Fourier)(1821-1854)…

《Linux运维总结:宝德服务器RAID开启(方式一)》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:Linux运维实战总结 一、背景信息 说明:从客户那里退回来的一台宝德服务器,硬盘不见了,现在需要用两个2T的硬盘…

NY118NY120美光固态闪存NY124NY129

NY118NY120美光固态闪存NY124NY129 美光NY系列固态闪存深度解析:技术、性能与行业洞察 技术架构与核心创新 美光NY系列(包括NY118、NY120、NY124、NY129等型号)作为企业级存储解决方案的代表作,延续了品牌在3D NAND技术上的深厚…

Odoo 19 路线图(新功能)

Odoo 19 路线图(新功能) Odoo 19 路线图是Odoo官方针对下一版本的发布计划,将在自动化、合规性、用户体验、碳排放报告及本地化等领域推出超过16项新功能。本路线图详细阐述了Odoo 19如何在过往版本基础上进一步提升,助力企业优化销售、财务、运营及客户…

基于NXP例程学习CAN UDS刷写流程

文章目录 前言1.概述1.1 诊断报文 2.协议数据单元(N_PDU)2.1 寻址信息(N_AI)2.1.1 物理寻址2.1.2 功能寻址2.1.3 常规寻址(Normal addressing)2.1.4 常规固定寻址(Normal fixed addressing)2.1.5 扩展寻址&…

基于有效集MPC控制算法的直线同步电机simulink建模与仿真,MPC使用S函数实现

目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统仿真参数 5.系统原理简介 6.参考文献 7.完整工程文件 1.课题概述 有效集算法通过迭代地选择一组 "有效" 约束,将约束优化问题转化为一系列无约束或等式约束优化问题。直线同步电机 (Linear Synch…

让敏感数据在流转与存储中始终守护在安全范围

在企业数字化运营浪潮中,企业内部应用服务器面临着非法访问、数据泄露等风险,如何全面守护应用服务器文件安全,让敏感数据在流转与存储中始终守护在安全范围? 服务器白名单让数据流转安全又高效 天 锐 蓝盾的服务器白名单功能既…

【Linux】find 命令详解及使用示例:递归查找文件和目录

【Linux】find 命令详解及使用示例:递归查找文件和目录 引言 find 是 Linux/Unix 系统中强大的文件搜索工具,用于在目录层次结构中递归查找文件和目录。它提供了丰富的搜索条件和灵活的操作选项,可以满足从简单到复杂的各种文件查找需求。 …

【论文阅读笔记】万花筒:用于异构多智能体强化学习的可学习掩码

摘要 在多智能体强化学习(MARL)中,通常采用参数共享来提高样本效率。然而,全参数共享的流行方法通常会导致智能体之间的策略同质,这可能会限制从策略多样性中获得的性能优势。为了解决这一关键限制,我们提出…

负载均衡LB》》HAproxy

Ubuntu 22.04 安装HA-proxy 官网 资料 # 更新系统包列表: sudo apt update # 安装 HAproxy sudo apt install haproxy -y # 验证安装 haproxy -v # 如下图配置 Haproxy 在这里插入代码片》》》配置完之后 重启 Haproxy sudo systemctl restart haproxy 补充几…

UE 5 和simulink联合仿真,如果先在UE5这一端结束Play,过一段时间以后**Unreal Engine 5** 中会出现显存不足错误

提问 UE5报错如图。解析原因 回答 你遇到的这个错误提示是: “Out of video memory trying to allocate a rendering resource. Make sure your video card has the minimum required memory, try lowering the resolution and/or closing other applications tha…

Rust 控制流

文章目录 Rust 控制流if 表达式循环实现重复用 loop 重复代码从循环返回值循环标签用于区分多层循环while 条件循环用 for 循环遍历集合 Rust 控制流 在大多数编程语言中,根据条件是否为真来运行某些代码,以及在条件为真时重复运行某些代码,是…

Python 3.11.9 安装教程

前言 记录一下Windows环境下Python解释器的安装过程。 安装过程 1、安装程序下载 打开Python官网: 点击Downloads,选择Windows: 页面中找到需要的3.11.9版本,点击Download Windows installer (64-bit)下载: 2、…

【各种主流消息队列(MQ)对比指南】

主流消息队列对比分析 一、核心指标对比 特性/消息队列RabbitMQKafkaRocketMQActiveMQPulsar协议支持AMQP, MQTT, STOMP自定义协议JMS/自定义协议JMS, AMQP, MQTT, STOMPMQTT, AMQP, STOMP单机吞吐量万级百万级十万级万级百万级延迟微秒级(低吞吐)毫秒…