JavaScript 原型与原型链完全指南

前言

如果你学习 JavaScript,却不理解原型和原型链,那就像学会了写句子却不理解语法规则。原型是 JavaScript 实现面向对象编程的核心机制,也是面试中几乎必考的知识点。本文将带你彻底理解 JavaScript 的原型与原型链。

一、原型(prototype)是什么

1.1 原型的定义

在 JavaScript 中,原型(Prototype)是函数天生拥有的一个属性。每当你定义一个函数时,JavaScript 引擎会自动为这个函数添加一个 prototype 属性,这个属性的值是一个对象。

1.2 为什么要用原型?

  1. 我们可以将一些属性和方法挂载在原型上,在创建实例之后,实例就可以调用这些属性和方法
  2. 我们也可以将一些公用的属性和方法添加在原型上,减少构造函数在执行时的性能开销
ini 复制代码
function Car(color) { this.color = color; }
Car.prototype.name = 'su7';

const car1 = new Car('红');
const car2 = new Car('蓝');
console.log(car1.name === car2.name); // true,共享属性

1.3 原型三大特性

特性 说明
函数天生拥有 每个函数都有 prototype
实例可访问 实例能调用原型上的方法
实例无法修改 修改实例只会创建自身属性,不会影响原型
ini 复制代码
Car.prototype.name = 'su7';
const car = new Car('蓝');
car.name = '蔚来';     // 创建实例自身属性
console.log(Car.prototype.name); // su7,原型不受影响

二、隐式原型 (__ proto__)

2.1 什么是隐式原型

所有对象都有 __proto__ 属性,指向创建该对象的构造函数的原型:

javascript 复制代码
function Person() {}
const p = new Person();

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

2.2 属性查找规则

v8 在访问对象中的一个属性时,会先访问对象中显示存在的属性,如果没有,就会去对象的隐式原型上查找

ini 复制代码
Car.prototype.name = 'su7';
function Car(color) { this.color = color; }

const car = new Car('blue');
console.log(car.name);  // su7(原型上找到)
console.log(car.color); // blue(自身属性)

2.3 核心公式

ini 复制代码
实例.__proto__ === 构造函数.prototype
构造函数.prototype.constructor === 构造函数

2.4 constructor 属性

原型上的 constructor 指向构造函数,记录实例的创建者:

javascript 复制代码
function Person() {}
console.log(Person.prototype.constructor === Person); // true

四、原型链详解

4.1 原型链查找

v8 在访问对象中的一个属性时,会先访问对象中显示存在的属性,如果没有,就会去对象的隐式原型上查找,如果还没有,就会顺着隐式原型一直往上找,直到找到 null 为止,这个查找关系,就叫原型链查找

4.2 原型链继承

原型链是实现继承的核心机制:

ini 复制代码
Grand.prototype.house = function() { console.log('汤臣一品'); };
function Grand() { this.card = 100000000; }

Father.prototype = new Grand();
function Father() { this.lastName = '张'; }

Child.prototype = new Father();
function Child() { this.age = 18; }

const p = new Child();
p.house(); // 汤臣一品(通过原型链找到)

4.3 完整原型链

javascript 复制代码
const f1 = new Foo()

1.f1.__proto__ = Foo.prototype

2.Foo.prototype.__proto__ = Object.prototype

3.Object.prototype.__proto__ = null

4.Foo.__proto__ = Function.prototype

5.Function.prototype.__proto__ = Object.prototype

6.Function.__proto__ = Function.prototype

五、总结

原型与原型链是 JavaScript 实现面向对象的核心机制。每个函数都有 prototype 属性指向原型对象,每个对象都有 __proto__ 指向构造函数的原型,它们通过 constructor 形成紧密联系。属性查找时,JS 会沿着 __proto__ 形成的链向上查找,直到 null .

相关推荐
默_笙19 分钟前
😁 LLM 不知道的事它不会说"不知道",而是会"编"——RAG 就是让它闭嘴先查资料
前端·javascript
Revolution6120 分钟前
变量提升到底提升了什么:为什么 var 是 undefined,let 却直接报错
前端·javascript
labixiong25 分钟前
ES2026 落地了什么?两个真上线的特性 + 两个被毙的,一次讲清楚
javascript·ecmascript 6·ecmascript 8
IT知识分享39 分钟前
WebP转JPG开发经验:从格式解码到本地批量转换的实践
javascript·python·图片转换
肖志-AI全栈43 分钟前
JavaScript 快速排序:从 pivot、双指针到分治思想
开发语言·javascript·排序算法
To_OC2 小时前
拼路径读文件总踩坑?我把 Node 的 path 和 fs 彻彻底底捋了一遍
javascript·后端·node.js
自然 醒2 小时前
记录We码开发者工具的一个bug
前端·javascript·bug
葡萄城技术团队2 小时前
HTML元素单元格:用自定义 CellType 扩展 SpreadJS 的显示能力
前端·javascript·html
shawxlee13 小时前
vue3在public下封装config.js自定义配置动态数据,可在打包后直接修改,方便后端部署及后续维护
前端·javascript·经验分享·vue·团队开发·js·项目优化
kyriewen14 小时前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试