原型、原型对象

通俗理解:“类的原型对象就是一块区域里有这个类的实例对象通用的属性和方法

这就是 JavaScript 中原型(prototype)的核心作用和设计理念。​

  1. ​“一块区域” = 原型对象本身(如 String.prototypeArray.prototypeMyClass.prototype):​

    • 这是一个实实在在存在的 JavaScript 对象。
    • 它就是为特定“类”(或更准确地说,为通过特定构造函数创建的对象)专门开辟的共享资源池
  2. ​“有...通用的属性和方法” = 原型对象上定义的属性和方法:​

    • 开发人员(或语言本身)会将所有该类型对象需要共享的功能(方法)和可能需要的共享数据(属性)放入这个“区域”中。
    • 例如:
      • 所有字符串都要会用 .toUpperCase().slice() → 这些方法就存在 String.prototype 这个“区域”里。
      • 所有数组都要会用 .map().filter().push() → 这些方法就存在 Array.prototype 这个“区域”里。
      • 你自己定义了一个 Person 类,所有 Person 实例都要能 .sayHello() → 这个方法就定义在 Person.prototype 这个“区域”里。
  3. ​“实例对象通用的” = 通过原型链实现共享:​

    • 关键机制:当您通过 new Constructor() 创建一个实例(比如 const myStr = new String('hello'); 或 const p = new Person('Alice');),这个新对象内部会自动连接(指向)构造函数的 prototype 对象(那个“区域”)。
    • 当你访问这个实例的属性或方法时(如 myStr.toUpperCase() 或 p.sayHello()):​
      • JavaScript 引擎会首先在实例对象自身属性中查找。
      • 如果在实例自身没找到,它会自动去您说的那个“共享区域”(即原型对象)里去查找!​
    • 这个过程就是原型链查找。正是这个机制,使得所有实例都能复用定义在原型对象上的属性和方法,实现了您所说的“通用”。
1. 原型对象(Prototype Object)​

✅ 定义:
"原型对象是每个JavaScript函数自带的prototype属性指向的特殊对象。它存储了该构造函数创建的所有实例共享的属性和方法。"

✅ 核心特点:

  1. 是构造函数(类)的共享方法容器
  2. 通过构造函数.prototype直接访问
  3. constructor属性指回构造函数本身
2. 原型(Prototype)​

✅ 定义:
"原型是JavaScript中每个对象内部维护的隐式继承链接​(通过__proto__Object.getPrototypeOf()访问)。它决定了属性和方法的查找路径。"

✅ 核心机制:

  1. 形成原型链(prototype chain)实现继承
  2. 属性查找规则:对象自身 → 原型链向上查找 → 终点null
  3. 函数.prototype是其实例的原型起点

原型对象和通过构造函数创建的实例对象

 相同点:

都是对象(Object 类型)​

class MyClass {}
const a = new String("hello");      // a 是字符串对象
const protoObj = MyClass.prototype;  // protoObj 是原型对象console.log(typeof a);         // "object"
console.log(typeof protoObj);  // "object"

 本质区别:

特征普通对象 (如 a)​原型对象 (构造函数.prototype)​
创建方式new 构造函数() 或字面量函数声明时自动创建
核心作用存储数据/业务逻辑作为共享方法的容器
特殊属性必含 constructor 指向构造函数
内存中的角色实例对象其他对象的原型模板
示例a.indexOf("e") (数据操作)String.prototype.indexOf = function(){} (方法定义)
 关键关系:
const str = new String("test");// 原型对象在继承链的上游
console.log(str.__proto__ === String.prototype,  // true:实例的隐式原型指向原型对象str instanceof String                // true:继承关系的体现
);// 原型对象本身也是普通对象
console.log(String.prototype instanceof Object   // true:原型对象也是对象
);
总结:

"​原型对象是特殊的共享容器对象,普通对象是数据载体
当执行 var a = new String()

  • a 是实例对象​(用于操作数据)
  • String.prototype 是原型对象​(存储所有字符串共享方法)
    它们的共性是都是对象,差异在于在原型系统中的角色和定位不同。"

结论:

  • 原型对象和实例对象都是对象,但原型对象是构造函数的属性,实例对象是构造函数创建的对象。
  • 它们通过原型链连接:实例对象的隐式原型(__proto__)指向构造函数的原型对象(prototype)。

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

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

相关文章

STM32 IIC通信(寄存器与hal库实现)

一、IIC基础知识 1. 串口通信与IIC通信串口通信通常需要至少三条线(TX、RX和GND),而 I2C 总线仅需要两条信号线(SDA和SCL);串口通信仅支持一对一通信,而 I2C 总线支持多机通信,允许单…

宝塔 php支持sqlserver

PDOException: SQLSTATE[IMSSP]: This extension requires the Microsoft ODBC Driver for SQL Server to communicate with SQL Server.错误原因这是 PHP 试图连接 SQL Server 数据库,但缺少必要的 ODBC 驱动支持 导致的。具体来说:你使用的是 PDO_SQLS…

day02-数组part02

一、长度最小的子数组(滑动窗口) leetcode 209 长度最小子数组 这道题的核心思想就是使用滑动窗口,滑动窗口三板斧: 初始位置i滑动窗口长度j-i1结束位置j 我们在写代码时是通过for循环来控制结束位置j,而初始位置i…

天爱验证码深度解析:从原理到实战,构建 Web 安全新防线

在网络安全日益严峻的当下,验证码作为抵御自动化攻击的重要屏障,其性能与可靠性直接关系到系统的安全稳定。天爱验证码(TIANAI CAPTCHA)作为国内优秀的开源行为验证码解决方案,凭借独特的技术优势,在电商、…

软考(软件设计师)软件工程-软件质量,软件测试,McCabe圈复杂度

软件质量 ISO/IEC 9126 是软件工程领域的经典质量模型,于1991年首次发布,2001年更新后成为软件产品质量评估的国际标准。其核心贡献是将抽象的“质量”概念分解为可度量、可管理的特性体系。以下是深度解析(2023年行业实践视角)&a…

CentOS7环境安装包部署并配置MySQL5.7

卸载MySQL卸载MySQL5.71、关闭MySQL5.7服务service mysqld stop2、查看MySQL安装rpm -qa|grep -i mysqlmysql-community-libs-5.7.35-1.el7.x86_64mysql-community-libs-compat-5.7.35-1.el7.x86_64mysql-community-common-5.7.35-1.el7.x86_64mysql57-community-release-el7-1…

1-Git安装配置与远程仓库使用

Git安装配置与远程仓库使用 1. Git 下载与安装 ① 进入Git 官网 https://git-scm.com/ ② 选择合适系统版本下载,本文以windows为例进行下载 当前最新版本为 2.50.1 ,浏览器默认下载很慢,用迅雷比较快 ③ 安装Git 我安装在D盘 等待完…

开源“具身大脑” 实现不同机器人群体协作-RoboBrain

开源“具身大脑” 实现不同机器人群体协作-RoboBrain 具身大小脑协作框架RoboOS与开源具身大脑RoboBrain,实现跨场景多任务轻量化快速部署与跨本体协作,推动单机智能迈向群体智能,为构建具身智能开源统一生态加速场景应用提供底层技术支持。支…

【笔记】训练步骤代码解析

目录 config参数配置 setup_dirs创建训练文件夹 load_data加载数据 build_model创建模型 train训练 记录一下训练代码中不理解的地方 config参数配置 config {data_root: r"D:\project\megnetometer\datasets\WISDM_ar_latest\organized_dataset",train_dir: t…

Java填充Word模板

文章目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码实体类工具类三、测试四、运行结果五、注意事项前言 最近有个Java填充Word模板的需求,包括文本,列表和复选框勾选,写一个工具类,以此…

【MYSQL8】springboot项目,开启ssl证书安全连接

文章目录一、开启ssl证书1、msysql部署时默认开启ssl证书2、配置文件3、创建用户并指定ssl二、添加Java信任库1、使用 keytool 导入证书2、验证证书是否已导入三、修改连接配置一、开启ssl证书 1、msysql部署时默认开启ssl证书 可通过命令查看: SHOW VARIABLES L…

Telegraf vs. Logstash:实时数据处理架构中的关键组件对比

在现代数据基础设施中,Telegraf 和 Logstash 是两种广泛使用的开源数据收集与处理工具,但它们在设计目标、应用场景和架构角色上存在显著差异。本文将从实时数据处理架构、时序数据库集成、消息代理支持等方面对比两者的核心功能,并结合实际应…

Vue Vue-route (4)

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue-route 编程式导航和几种路由 目录 编程式导航 详情组件 创建组件 设置路由 电影列表 传参 另一种方式 动态路由 命名路由 别名 总结 编程式导航 点击电影列表 跳转电影详情 详情组件 创建组件 在views中创…

存在两个cuda环境,在conda中切换到另一个

进入 openmmlab 环境 conda activate openmmlab 设置环境变量为 CUDA 12.4(只影响当前 shell 会话) export PATH/usr/local/cuda-12.4/bin:PATHexportLDLIBRARYPATH/usr/local/cuda−12.4/lib64:PATH export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64:…

Django 视图(View)

1. 视图简介 视图负责接收 web 请求并返回 web 响应。视图就是一个 python 函数,被定义在 views.py 中。响应可以是一张网页的 HTML 内容、一个重定向、一个 404 错误等等。响应处理过程如下图: 用户在浏览器中输入网址:www.demo.com/1/100Django 获取网址信息,去除域名和端…

HarmonyOS基础概念

一、OpenHarmony、HarmonyOS和Harmony NEXT区别OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,开放原子开源基金会由华为、阿里、腾讯、百度、浪潮、招商银行、360等十家互联网企业共同发起组建。目标是面向全…

spark3 streaming 读kafka写es

1. 代码 package data_import import org.apache.spark.sql.{DataFrame, Row, SparkSession, SaveMode} import org.apache.spark.sql.types.{ArrayType, DoubleType, LongType, StringType, StructField, StructType, TimestampType} import org.apache.spark.sql.functions._…

【跟着PMP学习项目管理】每日一练 - 3

1、你是一个建筑项目的项目经理。电工已经开始铺设路线,此时客户带着一个变更请求来找你。他需要增加插座,你认为这会增加相关工作的成本。你要做的第一件事? A、拒绝做出变更,因为这会增加项目的成本并超出预算 B、参考项目管理计划,查看是否应当处理这个变更 C、查阅…

CentOS 安装 JDK+ NGINX+ Tomcat + Redis + MySQL搭建项目环境

目录第一步:安装JDK 1.8方法 1:安装 Oracle JDK 1.8方法 2:安装 OpenJDK 1.8第二步:使用yum安装NGINX第三步:安装Tomcat第四步:安装Redis第五步:安装MySQL第六步:MySQL版本兼容性问题…

如何设计一个登录管理系统:单点登录系统架构设计

关键词:如何设计一个登录管理系统、登录系统架构、用户认证、系统安全设计 📋 目录 开篇:为什么登录系统这么重要?整体架构设计核心功能模块安全设计要点技术实现细节性能优化策略总结与展望 开篇:为什么登录系统这么…