当前位置: 首页 > news >正文

原型

什么是原型(prototype)
每个函数在出生时就自带一个属性:
函数名.prototype —— 它是一张空对象,浏览器里叫 Foo.prototype。
每个对象在出生时也自带一个“隐姓埋名”的属性:
对象.proto(规范名 [[Prototype]]),它指向自己构造函数的 prototype。

用处:让所有实例共享一份方法/数据,省内存 + 能动态升级。
一、没有原型时:方法满天飞,内存爆炸
JavaScript
复制
function User(name) {
this.name = name
this.sayHi = function () { // 每个实例都新建一份
console.log(Hi, ${this.name})
}
}

const u1 = new User('Tom')
const u2 = new User('Jerry')

console.log(u1.sayHi === u2.sayHi) // false ➜ 100 万个用户就 100 万份函数
内存示意图:
复制
u1 : { name: 'Tom', sayHi: <func obj#1> }
u2 : { name: 'Jerry',sayHi: <func obj#2> } // 两份完全一样的代码
二、把方法挂到原型上:只存一份,所有实例自动可用
function User(name) {
this.name = name // 实例私有属性
}
// 公有方法 → 原型仓库
User.prototype.sayHi = function () {
console.log(Hi, ${this.name})
}

const u1 = new User('Tom')
const u2 = new User('Jerry')

console.log(u1.sayHi === u2.sayHi) // true ➜ 同一份函数
u1.sayHi() // Hi, Tom
u2.sayHi() // Hi, Jerry
内存示意图:
u1 : { name: 'Tom', proto -> User.prototype }
u2 : { name: 'Jerry',proto -> User.prototype } // 指向同一份

User.prototype : { sayHi: <func obj#1> }
原型链
当读取 对象.属性 时:
1.先看对象自身有没有;
2.没有 → 沿 proto 去原型对象找;
3.再没有 → 原型的原型(protoproto)……
4.直到 null 为止,这条链式查找路径就叫原型链。
u1.proto → Foo.prototype → Foo.prototype.proto → Object.prototype → null
作用 = 复用方法、实现继承、属性共享、instanceof 判断。

http://www.zskr.cn/news/12084.html

相关文章:

  • 基于菲涅尔积分的角锥喇叭方向图计算
  • Flask的ORM工具SQLAlchemy
  • 构建复合AI系统以实现可扩展工作流
  • 实验任务1
  • 61.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--提取金额 - 实践
  • 使用 Ansible 部署 Elasticsearch 集群
  • 免费无广告!这款开源工具让文件转换像复制粘贴一样简单!
  • 在Vue.js中设置方法时访问$vuetify实例
  • 纷享销客CRM任务系统:破解快消品终端动销管理难题
  • 记录java调用eclipse cdt 解析c++文件
  • 12分钟讲解Python核心理念
  • 阻止HTML input元素(type=number)中输入字母e的方法
  • 【Prompt学习技能树地图】利用GitHub-Prompt Engineering Guide进阶学习Prompt工程指南 - 指南
  • epub如何让标题在竖直方向居中
  • 完整教程:区间dp,数据结构优化dp等6种dp,各种trick深度讲解
  • Windows11 右键菜单管理
  • 完整教程:leetcode (2)
  • 【GitHub每日速递 250926】12 周 24 课,边学边练!微软 AI 初学者的通关秘籍
  • mcp-use mcp server 交互工具
  • 年薪破百万、涨薪60%,人形机器人企业疯狂「抢人」
  • 深入解析:HttpClientFactory vs new HttpClient:.NET Core HTTP 客户端的正确打开方式
  • Java 与交通科技:智慧交通与自动驾驶实践
  • 我的第一个漏洞:通过密码重置实现邮箱枚举
  • AI智慧:下一站•不是算法而是「深耕」
  • # vite + vue3 实现打包后 dist 文件夹可以直接打开 html 文件预览
  • adb.exe: more than one device/emulator 杀掉旧的adb进程
  • Codeforces Round 1054 (Div. 3)
  • 【System Beats!】第三章 程序的机器级表示
  • 做题记录3
  • 2025年9月训练记录