JavaScript 原型

这个图描述了构造函数,实例对象和原型三者之间的关系,是原型链的基础:

  • 实例对象由构造函数new产生;
  • 构造函数的原型属性与实例对象的原型对象均指向原型
  • 原型对象中有一个属性constructor指向对应的构造函数

原型链的基础都是从上图延展的,下面再来一张完整的关系图:

一个简单的demo

javascript 复制代码
function funA(name) {
  this.name = name;
}
funA.prototype.sayHello = function () {
  return `${this.name} say hello`
}
​
const a1 = new funA()
// a1.__proto__ === funA.prototype
// funA.prototype.constructor === funA

需要注意的点:

  • Function.prototype === Function.__proto__ // true
  • 只有 Function.prototype 原型是一个 function; 其它函数的原型都是 object
  • 所有构造函数的实例 公用一个 原型对象,它自身的方法、属性不共享
  • 只有对象才有 __proto__属性
  • 只有函数才有prototype属性
  • Function 和 Object 是 object & function,它们是js框架底层自己实现
  • 理解几个关键概念:new、prototype、construtor、__proto__

原型链介绍

比较好的文章

掘金上找到一 布局比较好的图片:

当访问对象的属性或方法时,JavaScript 会:

  • 原型链的核心是通过 __proto__ 属性串联起来的,它是对象之间继承关系的 "连接线"
  • 首先在对象自身查找
  • 如果没有找到,沿着原型链向上查找
  • 直到找到属性或到达原型链末端(null)

ES6 类语法(语法糖)

javascript 复制代码
class Vehicle {
    constructor(brand, year) {
        this.brand = brand;
        this.year = year;
    }
    
    getInfo() {
        return `${this.brand} (${this.year})`;
    }
    
    start() {
        console.log(`${this.brand} starting...`);
    }
}
​
const myCar = new Car("Honda", 2021, 4);

总结

  • 构造函数 :用于创建对象的函数,通过 new 关键字调用
  • prototype:函数特有的属性,包含应该被所有实例共享的方法
  • 原型链 :对象通过 __proto__ 链接形成的继承链
  • 继承:通过设置子类 prototype 为父类实例来实现
  • ES6 class:语法糖,底层仍然基于原型继承

理解原型系统是掌握 JavaScript 面向对象编程的关键,它解释了 JavaScript 中对象如何共享方法和属性,以及继承是如何工作的。

相关推荐
孟健1 小时前
Claude Code 同需求写两版对比:装不装 frontend-design 差多远?
前端·ai编程·claude
OpsEye1 小时前
大模型 Token 计量不准,是什么原因,怎么解决??
javascript·ai编程
梦de天空一米16883 小时前
【一个重复id让游戏卡在62%,聊聊配置表检查】
前端
ryn483983 小时前
01 一个功能模块,怎么分层才不乱
前端·ai编程·claude
Amos_Web3 小时前
通过 Rspack 源码学 Rust(五):读懂 Result 与问号运算符的错误返回
前端
杨航 AI3 小时前
JEV的用法
java·前端·数据库
Amos_Web3 小时前
Rspack 源码解析(三十五):rspack_error 如何用 miette 渲染带源码定位的错误链
前端
去伪存真3 小时前
高敏资产场景下的大模型协同设计架构
前端·agent
修炼的dance3 小时前
OCR预处理测了108组,纠斜去噪有用,坑在顺序和力度
前端
疯华整猫3 小时前
Android 16 后台常驻适配:用 Trae 搭一套“前台服务 + 加急 Job”的可存活架构
前端