原型是 JavaScript 实现继承与代码复用的核心机制,也是面试高频考点。本文结合个人学习经验、核心概念解析与实战案例,帮你彻底搞懂原型、prototype__proto__ 及相关知识点,同时分享高效的学习方法。

一、个人学习方法:高效掌握复杂知识点

复杂概念(如原型)的学习,关键在“边输入边记录”和“先模仿后创新”,我的核心方法如下:

1. 边看教程边做“双笔记”

  • 截图笔记:遇到关键代码(如 prototype 挂载方法)、原型链图示时,立刻截图并标注核心逻辑(比如在截图上写“__proto__ 指向构造函数的 prototype”);
  • 文字笔记:用自己的话总结知识点(比如“new 关键字的作用,就是创建一个对象并让它的 __proto__ 指向构造函数的 prototype”),避免照搬教程话术。
  • 好处:复盘时既能看代码细节,又能快速回忆自己的理解,比单纯看视频效率高 2 倍以上。

2. 利用碎片化时间,拒绝“无效等待”

很多事情(如视频加载、代码运行)存在空隙时间,此时可以:

  • 快速默写核心公式(如“对象.__proto__ === 构造函数.prototype”);
  • 梳理知识点逻辑(如“先区分普通对象和函数对象,再理解 prototype 的作用”);
  • 注意:如果事情需要全程专注(如调试复杂代码),则不强行拆分时间,避免打断思路。

3. 先仿造再创新:入门的“黄金法则”

学习原型这类抽象概念时,先“照抄”老师的代码(如给 Date 原型加方法),理解每一行的作用后,再做创新修改(如给 Array 原型加“去重方法”)。

  • 示例:先仿造“给 DateshowNowTime 方法”,再创新“给 DateshowTime 方法,支持返回 yyyy-MM-dd HH:mm 格式”。
  • 好处:降低入门难度,避免因“想不出创新点”而放弃,同时在仿造中积累手感。

二、原型核心概念:先理清“3 个基础问题”

在学原型前,必须先解决 3 个核心问题:区分普通对象与函数对象理解 prototype理解 __proto__

1. 问题 1:如何区分普通对象与函数对象?

JS 中所有值要么是“普通对象”,要么是“函数对象”,两者的核心区别是:是否有 prototype 属性(函数对象有,普通对象没有),常用 typeof 检测:

类型 定义方式 typeof 结果 是否有 prototype 示例
普通对象 对象字面量、new Object() object var o = {name: 'a'}
函数对象 函数声明、new Function() function function fn(){}, Date
实战检测代码
// 普通对象:typeof 为 object,无 prototype
var o1 = { name: '诗书画唱' };
var o2 = new Object();
var arr = [1, 2, 3]; // 数组是特殊的普通对象
console.log(typeof o1); // object(普通对象)
console.log(typeof arr); // object(普通对象)
console.log(o1.prototype); // undefined(普通对象无 prototype)// 函数对象:typeof 为 function,有 prototype
function fn() {}
var Dog = function() {};
console.log(typeof fn); // function(函数对象)
console.log(typeof Date); // function(Date 是内置函数对象)
console.log(fn.prototype); // object(函数对象有 prototype,默认是普通对象)// 特殊例外:Function.prototype 是函数对象(唯一例外)
console.log(typeof Function.prototype); // function(其他函数对象的 prototype 都是 object)

2. 问题 2:prototype 是什么?有什么用?

prototype函数对象特有的属性,本质是一个“普通对象”(除了 Function.prototype),核心作用是实现代码复用——给 prototype 加的属性/方法,所有由该函数构造的对象都能访问到。

核心特点
  • 只有函数对象有 prototype(普通对象没有);
  • 函数对象的 prototype 中,默认有 constructor 属性,指向该函数本身(如 fn.prototype.constructor === fn);
  • 示例:给 Stu 函数的 prototypesex 属性,所有 new Stu() 创建的对象都能访问 sex
实战代码:prototype 实现代码复用
// 1. 定义函数对象(构造函数)
function Stu(name) {this.name = name; // 每个对象独有的属性(姓名不同)
}// 2. 给 prototype 加“共享属性/方法”(所有学生都有相同的性别和“学习方法”)
Stu.prototype.sex 

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

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

相关文章

【人工智能】2025年AI代理失控危机:构建安全壁垒,守护智能未来

还在为高昂的AI开发成本发愁?这本书教你如何在个人电脑上引爆DeepSeek的澎湃算力! 在2025年,AI代理(AI Agents)已成为日常生活和企业运营的核心组成部分,它们能够自主决策、执行任务并与环境互动。然而,随着AI代理能力的指数级提升,其安全隐患也日益凸显,包括数据泄露…

从噪声到动作:Diffusion Policy 如何改变机器人学习?

从噪声到动作:Diffusion Policy 如何改变机器人学习? 引言 在机器人手臂操作方面一直存在诸多挑战。我们熟悉的工业场景中的组装机械臂,往往依赖于写死的程序指令进行控制,具有高度规范化与高精度的特点。而当机械臂需要在复杂、…

量子计算和超级计算机将彻底改变技术

我们生活在技术时代,但未来仍有无限可能。近年来,各大企业在量子计算领域持续迈出虽小却关键的步伐 —— 这一技术注定将彻底改变我们所熟知的世界。以下精选的潜在应用场景,将对从交通出行到医疗健康的多个领域产生深远影响。 在由 “1” 和…

Linux 中文显示空白框(Java)

问题展示:解决方案本系统采用宋体,若是其它字体,可以类似排查Font rewardFirstFont new Font("SimSun", Font.BOLD, 20);linux系统字体-检查查询linux系统所有字体fc-list检查是否有目标字体(SimSun)&#…

普通用户使用docker命令

参考大佬 https://blog.51cto.com/u_16175448/12082279 详细步骤及代码 步骤 1:安装 Docker 首先,你需要安装 Docker。 步骤 2:创建 Docker 用户组 Docker 默认以 root 用户运行,为了普通用户能够使用 Docker,我们需要…

【传奇开心果系列】Flet框架实现的家庭记账本示例自定义模板

Flet家庭记账本示例自定义模板一、效果展示截图二、Flet家庭记账本概况介绍三、应用特色1. 简洁直观的用户界面2. 全面的财务管理功能3. 实时数据监控4. 数据可视化分析5. 数据管理功能四、使用场景个人财务管理家庭账务管理小微企业记账学生理财教育五、主要功能模块&#xff…

Node.js 在 Windows Server 上的离线部署方案

Node.js 在 Windows Server 上的离线部署方案 离线部署的核心是提前准备所有依赖资源(避免在线下载),并通过本地配置完成服务搭建,整体分为「依赖准备」「环境配置」「项目部署」「服务注册」4个阶段。 一、提前准备离线资源&am…

SpringAI接入openAI配置出现的问题全解析

SpringAI接入openAI配置出现的四个问题全解析1、无法下载openAI或SpringAI依赖包1.1、思路就是从哪个源下载所需的依赖包1.2、解决思路:我们可以看阿里的中央仓库是否有集成SpringAI的依赖,从它这里下也是可以的。我们看看阿里云云效maven地址&#xff0…

自然语言处理——02 文本预处理(上)

1 认识文本预处理 概念: 文本语料在输送给模型前一般需要一系列的预处理工作,才能符合模型输入的要求;比如:将文本转化成模型需要的张量、规范张量的尺寸;比如: 关于数据X:数据有没有脏数据、数…

数据结构:二叉树的链式存储

用链表来表示一棵二叉树,即用指针指向来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。 我们之前就已经说过,二叉树是递归…

【Spring Boot把日志记录到文件里面】

<?xml version"1.0" encoding"UTF-8"?> <configuration><!-- 日志输出格式 --><property name"LOG_PATTERN" value"%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" /><!-- 日志…

大数据服务完全分布式部署- 其他组件(阿里云版)

ZooKeeper 安装 官网 解压 cd /export/server/ tar -zxvf /export/server/apache-zookeeper-3.9.3-bin.tar.gz -C /export/server/软链接 ln -s /export/server/apache-zookeeper-3.9.3-bin /export/server/zookeeper配置 cd /export/server/zookeeper/ mkdir zkDatamyid…

Windows 平板/电脑 上使用 DHCPSRV 搭建 DHCP 服务器

一、DHCPSRV 核心优势 轻量便携:单文件绿色软件,无需安装 全图形界面:比命令行工具更友好 支持IPv4/IPv6:满足现代网络需求 低资源占用:适合平板电脑运行(内存<10MB) 租约管理:可查看实时IP分配情况 二、超详细配置流程 1. 下载与初始化 官网下载:http://www…

ArcGIS动态表格批量出图

前言&#xff1a;产品介绍&#xff1a;ArcGIS动态表格扩展模块Mapping and Charting Solutions&#xff0c;可用于插入动态表格&#xff0c;与数据驱动结合&#xff0c;出图效率无敌。注&#xff1a;优先选择arcgis10.2.2。 一、首先是根据自身携带的arcgis数据进行下载对应的…

Linux小白加油站,第三周周考

1.如何查看当前系统中所有磁盘设备及其分区结构(如磁盘名称、大小、挂载点等)? lsblk # 显示磁盘名称、大小、挂载点&#xff08;P21&#xff09;2.若需对空闲磁盘(如/dev/sdb)进行交互式划分&#xff0c;如何进入操作界面并创建一个5GB的主分区(类型为Linux默认文件系统)? …

SEO的红利没了,下一个风口叫GEO

一、 搜索在退场&#xff0c;答案在上台过去二十多年&#xff0c;我们习惯了这样的路径&#xff1a;输入关键词 → 点开一堆蓝色链接 → 慢慢筛出想要的信息。SEO&#xff08;搜索引擎优化&#xff09;就是围绕这套游戏规则展开的&#xff0c;谁玩得溜&#xff0c;谁就有流量、…

Kubernetes 的 YAML 配置文件-apiVersion

Kubernetes的YAML配置文件–apiVersion 关于 Kubernetes 的 apiVersion 说明 以及 生产环境中推荐使用的版本 的完整指南,帮助你正确、安全地编写 Kubernetes 配置文件。 一、什么是 apiVersion? 在 Kubernetes 的 YAML 配置文件中,apiVersion 字段用于指定你所使用的 Kub…

uniapp 5+App项目,在android studio模拟器上运行调试

1.安装android studio&#xff0c;默认安装即可 点击下载android studio 2.安装完成后&#xff0c;添加设备 选择机型并下载 启动模拟机&#xff08;启动比较慢&#xff0c;稍等一会即可&#xff09; 3.等待模拟器启动后&#xff0c;在uniapp上运行项目到模拟器 如果下…

Qt猜数字游戏项目开发教程 - 从零开始构建趣味小游戏

Qt猜数字游戏项目开发教程 - 从零开始构建趣味小游戏 项目概述 本项目是一个基于Qt框架开发的猜数字游戏&#xff0c;具有现代化的UI设计和完整的游戏逻辑。项目采用C语言开发&#xff0c;使用Qt的信号槽机制实现界面交互&#xff0c;通过随机数生成和状态管理实现完整的游戏…

初识CNN05——经典网络认识2

系列文章目录 初识CNN01——认识CNN 初识CNN02——认识CNN2 初识CNN03——预训练与迁移学习 初识CNN04——经典网络认识 文章目录系列文章目录一、GoogleNet——Inception1.1 1x1卷积1.2 维度升降1.3 网络结构1.4 Inception Module1.5 辅助分类器二、ResNet——越深越好2.1 梯…