JavaScript原型链

随记:JavaScript原型链

前言

小编学习前端的随记,个人理解,欢迎大佬纠错

正文

在认识JS原型链之前我们先认识几个概念:显示原型、原型对象、实例对象、对象原型(隐式原型)

显示原型

所有概念都出自于函数对象中,而函数有许多的属性,其中就有这么一个特殊的属性叫显示原型:prototype

原型对象
javascript 复制代码
function Person(){}
console.log( Person.prototype );

控制台输出

javascript 复制代码
{
    constructor: ƒ Person(),
    __proto__: {
        constructor: ƒ Object(),
        hasOwnProperty: ƒ hasOwnProperty(),
        isPrototypeOf: ƒ isPrototypeOf(),
        propertyIsEnumerable: ƒ propertyIsEnumerable(),
        toLocaleString: ƒ toLocaleString(),
        toString: ƒ toString(),
        valueOf: ƒ valueOf()
    }
}

上面这个对象,就是大家常说的原型对象

可以看到,原型对象有⼀个自有属性constructor,这个属性指向该函数。这是形成原型链的一步。

实例对象
javascript 复制代码
// 1. 构造函数
function Person(name) {
    this.name = name; // 每个实例独有的属性
}

// 2. 创建"实例对象"
const p1 = new Person("张三");

console.log(p1)

控制台输出

javascript 复制代码
{"name":"张三"}

通过new关键字创建的对象,就叫做实例对象。

可以看到new出来的p1对象身上继承了其原Person对象的name属性。它可以有自己的属性和方法,也包括继承而来的属性和方法。

对象原型(隐式原型)
javascript 复制代码
// 1. 构造函数
function Person(name) {
    this.name = name; // 每个实例独有的属性
}

// 2. 创建"实例对象"
const p1 = new Person("张三");

// --- 验证关系 ---

// 实例的"对象原型" 指向 构造函数的"原型对象"
console.log(p1.__proto__ === Person.prototype); // true

对象原型 也可以叫做隐式原型,以下我们都叫做隐式原型。

是实例对象的一个属性------__proto__注意:这里每个都是两个下划线 。它是的作用是通过原型链来使用Person.prototype中的函数方法。

那么它们有什么作用呢?

我们可以把原型对象 Person.protoype比作一个开源项目,而它的作者就是构造函数 Person。相当于作者把自己的项目------构造函数 ,进行了开源,其中包括项目中的所有属性和方法。那么只要是这个作者的粉丝------实例对象 person ,都可以使用这个项目。

注意:new关键字只能继承构造函数的属性 ,而构造函数中的函数方法 ,是通过__proto__来实现的。

原型链

了解了上述四个概念之后,那么接下来就是原型链的一个关系图。

下面来解释一下

  1. 作者:构造函数Person
  2. constructor:它是Person.prototype的一个属性,指回该函数本身。
  3. 粉丝:person是由Person new出来的实例对象,它继承了Person所有的属性------开源项目的属性。
  4. 开源项目的方法:原型对象Person.prototype,存放着Person的函数方法。
  5. __proto__:当person想使用Person中的函数方法时,就会通过隐式原型__proto__顺着原型链指向Person.prototype来使用其方法。
  6. 而在JavaScript中"万物皆对象"。Person.prototype本身也是一个存在属性和方法的对象,它也会有__proto__的属性,并且会向上查找到内置对象,默认是由Object构造函数的prototype属性来创建的。但是原型链终有末端,内置对象最终指向null。此处的ObjectJavaScript自带的默认构造函数,它保证了所有函数的默认属性和方法。

就此,原型链搭建完成。

为什么叫"链"?
  1. 先看 person 自己有没有?没有。
  2. 顺着 person.__proto__ 找到 Person.prototype,有没有?没有。
  3. 顺着 Person.prototype.__proto__ 找到 Object.prototype,有没有?
  4. 如果还没找到,返回 undefined
    这种层层递进的查找关系,才是"链"的精髓。

到这,你已经理解了图中的上半部分------原型链的大半部分,已足够日常使用。下半部分是扩展内容,大家可以去自行搜索了解一下。

总结

  1. 每个函数 都有一个 prototype(显式原型),指向它的原型对象。
  2. 每个对象 都有一个 __proto__(隐式原型),指向创建它的构造函数的 prototype
  3. 原型链 就是由 __proto__ 串联起来的查找路径。
  4. Object.prototype.__proto__ === null 是原型链的终点。
相关推荐
早點睡3902 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-collapsible
javascript·react native·react.js
前端Hardy2 小时前
别再手写代码了!2026 前端 5 个 AI 杀招,直接解放 80% 重复劳动(附工具+步骤)
前端·javascript·面试
SuperEugene2 小时前
Element Plus/VXE-Table UI 组件库规范:统一用法实战,避开样式冲突与维护混乱|工程化与协作规范篇
前端·javascript·vue.js·ui·前端框架·element plus·vxetable
前端Hardy2 小时前
前端工程师必备的 10 个 AI 万能提示词(Prompt),复制直接用,效率再翻倍!
前端·javascript·面试
BioRunYiXue2 小时前
Nature Methods:CellVoyager 自主 AI 智能体开启生物数据分析新时代
大数据·开发语言·前端·javascript·人工智能·数据挖掘·数据分析
网络点点滴3 小时前
Vue3中Suspense的使用
前端·javascript·vue.js
酉鬼女又兒4 小时前
零基础快速入门前端Web存储(sessionStorage & localStorage)知识点详解与蓝桥杯考点应用(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯·html
angerdream4 小时前
最新版vue3+TypeScript开发入门到实战教程之组件通信之二
javascript·vue.js
小只笨笨狗~4 小时前
解决objectSpanMethod与expand共存时展开后表格错位问题
开发语言·javascript·ecmascript