前端知识点---原型-原型链(javascript)

news2025/3/16 9:49:31

文章目录

  • 原型
  • 原型链:
  • 实际应用
  • 面试题回答

原型

原型:每个函数都有prototype属性 称之为原型

因为这个属性的值是个对象,也称为原型对象

只有函数才有prototype属性

作用:
1.存放一些属性和方法
2.在Javascript中实现继承

const arr = new Array(1, 2, 3, 4)
console.log(arr.reverse)

为什么创建好了就可以使用这些方法呢? 就是原型的存在

Array构造函数也是一个函数 , 只要是函数就有个原型 就是Array.prototype

打开mdn
在这里插入图片描述
在这个原型身上已经挂载了很多方法, 这些方法是可以给所有的数组实例去使用的

为什么实例可以去使用这些方法呢 , 是因为_porto_

每个对象都有_proto_属性

作用: 这个属性指向它的原型对象
在这里插入图片描述

原型链:

在这里插入图片描述

关系总结:

构造函数 -> prototype -> 构造函数的原型对象
构造函数的原型对象 -> proto -> Object.prototype
Object.prototype -> proto -> null(原型链的终点)
代码演示:

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

const p = new Person("张三", 25);

// p 的 __proto__ 指向 Person.prototype
console.log(p.__proto__ === Person.prototype); // true

// Person.prototype 的 __proto__ 指向 Object.prototype
console.log(Person.prototype.__proto__ === Object.prototype); // true

// Object.prototype 是原型链的终点
console.log(Object.prototype.__proto__); // null

解释:
Person.prototype.proto 确实指向 Object.prototype。
Object.prototype 没有更上层的原型,所以它的 proto 是 null。

所以,构造函数的原型对象最终的 proto 是指向 Object.prototype,而 Object.prototype 的 proto 是 null,这是原型链的终点。

实际应用

  1. 共享方法,减少内存开销
    在大型项目中,如果每个实例都独立创建相同的方法,会占用大量内存。原型可以让多个实例共享方法,从而提高性能。

示例:创建对象的优化

function User(name) {
    this.name = name;
}

// 将方法放在 prototype 上,所有实例共享
User.prototype.sayHello = function() {
    console.log("Hello, my name is " + this.name);
};

let user1 = new User("Alice");
let user2 = new User("Bob");

user1.sayHello(); // 输出: Hello, my name is Alice
user2.sayHello(); // 输出: Hello, my name is Bob

✅ 优点:所有 User 实例共享 sayHello 方法,而不是每次创建实例都生成新的方法,节省内存。

  1. 继承与扩展
    在项目中,多个对象可能有相似的行为,我们可以利用原型继承来减少代码重复,提高复用性。

示例:父类与子类继承

function Animal(name) {
    this.name = name;
}

// 父类原型方法
Animal.prototype.speak = function() {
    console.log(this.name + " makes a sound");
};

// 子类
function Dog(name, breed) {
    Animal.call(this, name); // 继承属性
    this.breed = breed;
}

// 继承父类的方法
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

// 添加子类特有方法
Dog.prototype.bark = function() {
    console.log(this.name + " barks!");
};

let dog1 = new Dog("Buddy", "Labrador");
dog1.speak(); // 输出: Buddy makes a sound
dog1.bark();  // 输出: Buddy barks!

✅ 优点:

Dog 继承了 Animal 的 speak 方法,无需重复定义。
Dog.prototype 还能额外扩展 bark 方法,增强灵活性。
3. 扩展原生对象
有时候我们需要扩展 JavaScript 自带的对象,比如 Array、String 等。

示例:扩展 Array.prototype

Array.prototype.sum = function() {
    return this.reduce((total, num) => total + num, 0);
};

let numbers = [1, 2, 3, 4, 5];
console.log(numbers.sum()); // 输出: 15

✅ 优点:给所有数组对象增加 sum 方法,方便项目中复用。

⚠️ 注意:扩展原生对象可能会影响第三方库,应谨慎使用!

  1. 实现类的私有属性
    在 ES5 时代,我们可以通过原型和闭包结合,模拟私有变量,防止外部直接访问。

示例:使用闭包模拟私有属性

function Person(name) {
    let _age = 25; // 私有变量,外部无法直接访问
    this.name = name;

    this.getAge = function() {
        return _age;
    };
}

let p1 = new Person("Alice");
console.log(p1.name);  // Alice
console.log(p1.getAge()); // 25
console.log(p1._age);  // undefined,无法直接访问

✅ 优点:保护 _age 变量不被外部随意修改,提高安全性。

  1. 结合原型模式和单例模式
    在实际开发中,我们可能希望某个对象只存在一个实例(比如配置管理、数据库连接池等)。可以结合原型模式和单例模式来实现。

示例:全局配置管理

const Config = (function() {
    function Config() {
        this.theme = "dark";
        this.language = "en";
    }

    let instance;
    
    Config.getInstance = function() {
        if (!instance) {
            instance = new Config();
        }
        return instance;
    };

    return Config;
})();

let config1 = Config.getInstance();
let config2 = Config.getInstance();

console.log(config1 === config2); // true,说明是同一个实例

✅ 优点:

只创建一个 Config 实例,避免重复初始化配置,提高效率。
总结

应用场景代码示例主要作用
方法共享User.prototype.sayHello让多个实例共享方法,节省内存
继承与扩展Dog.prototype = Object.create(Animal.prototype)复用父类方法,减少代码重复
扩展原生对象Array.prototype.sum添加全局通用方法,增强功能
私有属性let _age = 25;保护数据,防止外部修改
单例模式Config.getInstance()确保对象全局唯一

在实际项目中,合理运用原型能有效提高代码复用性、减少冗余,并优化性能! 🚀

面试题回答

  • 1.原型:函数都有prototype属性,称之为原型,也称为原型对象N原型可以放一些属性和方法,共享给实例对象使用
    原型可以做继承
  • 2.原型链:对象都有_proto 属性,这个属性指向它的原型对象,原型对象也是对象,也有_proto 属性,指向原型对象的原型对象,这样一层一层形成的链式结构称为原型链,最顶层找不到则返回 null

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

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

相关文章

数据类设计_图片类设计之6_混合图形类设计(前端架构)

前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇,讨论混合图形类设计 方法论-现在能做什么 这段属于聊天内容---有句话是这么说的:不要只埋头拉车,还要抬头看路。写代码也是…

2024年12月CCF-GESP编程能力等级认证C++编程一级真题解析

一级真题的难度: ‌ CCF-GESP编程能力等级认证C++编程一级真题的难度适中‌。这些真题主要考察的是C++编程的基础知识、基本语法以及简单的算法逻辑。从搜索结果中可以看到,真题内容包括了选择题、编程题等题型,涉及的内容如C++表达式的计算、基本输入输出语句的理解…

尤瓦尔·诺亚·赫拉利(Yuval Noah Harari)作品和思想深度报告

尤瓦尔诺亚赫拉利(Yuval Noah Harari)作品和思想深度报告 引言 尤瓦尔诺亚赫拉利(Yuval Noah Harari)是当今最具影响力的公众知识分子之一 ynharari.com 。作为一名历史学家和哲学家,他以宏大的视角和清晰生动的语言…

JConsole:JDK性能监控利器之JConsole的使用说明与案例实践

🪁🍁 希望本文能给您带来帮助,如果有任何问题,欢迎批评指正!🐅🐾🍁🐥 文章目录 一、背景二、JConsole的启动与连接2.1 JConsole的启动2.2 进程连接2.2.1 本地进程连接2.2…

Neural Architecture Search for Transformers:A Survey

摘要 基于 Transformer 的深度神经网络架构因其在自然语言处理 (NLP) 和计算机视觉 (CV) 领域的各种应用中的有效性而引起了极大的兴趣。这些模型是多种语言任务(例如情绪分析和文本摘要)的实际选择,取代了长短期记忆 (LSTM) 模型。视觉 Tr…

Browser Copilot 开源浏览器扩展,使用现有或定制的 AI 助手来完成日常 Web 应用程序任务。

一、软件介绍 文末提供源码和开源扩展程序下载 Browser Copilot 是一个开源浏览器扩展,允许您使用现有或定制的 AI 助手来帮助您完成日常 Web 应用程序任务。 目标是提供多功能的 UI 和简单的框架,以实现和使用越来越多的 copilots(AI 助手&…

基于PSO粒子群优化的XGBoost时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 XGBoost算法原理 4.2 XGBoost优化 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b 3.部分核心程序 (完整版代码包含…

aws(学习笔记第三十三课) 深入使用cdk 练习aws athena

文章目录 aws(学习笔记第三十三课) 深入使用cdk学习内容:1. 使用aws athena1.1 什么是aws athena1.2 什么是aws glue1.2 为什么aws athena和aws glue一起使用 2. 开始练习aws athena2.1 代码链接2.2 整体架构2.3 代码解析2.3.1 创建测试数据的S3 bucket2.3.2 创建保…

基于RAGFlow本地部署DeepSpeek-R1大模型与知识库:从配置到应用的全流程解析

作者:后端小肥肠 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: DeepSpeek服务器繁忙?这几种替代方案帮你流畅使用!(附本地部署教程)-CSDN博客 10分钟上手…

SpringBoot 集成logback日志链路追踪

项目场景 有时候一个业务调用链场景,很长,调了各种各样的方法,看日志的时候,各个接口的日志穿插,确实让人头大。 为了解决这个痛点,就使用了 TraceId,根据 TraceId 关键字进入服务器查询日志中…

【Python办公】Excel通用匹配工具(双表互匹)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…

【JAVA】七、基础知识“if+switch+循环结构”详细讲解~简单易懂!

目录 7、逻辑控制 7.1 分支结构 7.1.1 if 语句 语法格式1 语法格式2 语法格式3 7.1.2 switch语句 基本语法 执行流程 7.2 循环结构 7.2.1 while循环 语法格式 7.2.2 Break 7.2.3 Continue 7.2.4 for循环 语法格式 执行过程 7.2.5 do while循环 语法格式 7.3 …

【C++】每日一练(轮转数组)

本篇博客给大家带来的是用C语言来解答轮转数组! 🐟🐟文章专栏:每日一练 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享! 今日思想:不服输的少年啊…

Python(学习一)

做网站有成熟的框架像FLASK、DJANGO、TORNADO,写爬虫有好用到哭的REQUESTS,还有强大到没盆友的SCRAPY 随着NUMPY、SCIPY、MATLOTLIB等众多第三方模块的开发和完善,不仅支持py支持各种数学运算,还可以绘制高质量的2D和3D图像&…

Java中类和对象

类和对象 面向对象的认识类的定义和使用1 类的定义2 类的创建3 类的实例化 构造方法1 构造方法的概念2 构造方法的注意事项 this关键字 面向对象的认识 前言 何为面向对象何为面向过程呢?,C语言是最经典的面向过程的语言,但是C语言虽然可以解决一定的问…

文本组件+Image组件+图集

Canvas部分知识补充 元素渲染顺序 以Hierarchy参考 下方物体在上方物体前显示 子物体在父物体前显示 下方物体永远在前显示,无论上方的层次结构 资源导入 绝对路径:C:\Windows\Fonts下的许多字体可以用做UIText的字体资源 图片导入: 1.图…

PyCharm 2019.1.3使用python3.9创建虚拟环境setuptools-40.8.0报错处理

目录 前置: 一劳永逸方法(缺最后一步,没有成行) step one: 下载高版本的pip、setuptools、virtualenv的tar.gz包 step two: 进入PyCharm安装目录的 helpers 目录下 step three: 下载并安装grep和sed命令,然后执行 …

服务器部署RocketMQ----Docker方式

拉取镜像并创建docker network 按照官方文档提供的方式拉取镜像:docker pull apache/rocketmq:4.9.6 创建一个docker网络:docker network create rocketmq 启动NameServer以及Broker 启动NameServer # 启动NameServer docker run -d --name rmqnames…

【推荐项目】052-用水监控管理系统

052-用水监控管理系统 介绍 用水监控管理系统 springboot java vuejs jdk1.8 当然,以下是一个简洁的用水监控管理系统的功能模块划分,基于Spring Boot(JDK 1.8)后端和Vue.js前端: 用水监控管理系统功能模块 后端&…

零基础上手Python数据分析 (2):Python核心语法快速入门

写在前面 场景:每周销售数据报表整理 任务描述: 你需要每周从多个Excel文件中汇总销售数据,计算各项指标(销售额、订单量、客单价等),并生成周报。Excel操作痛点: 文件太多,手动打开复制粘贴,效率低下,容易出错。 多个Excel文件,每个都要打开、筛选、复制数据,重复…