V8引擎隐藏类(VIP课程)

简介: V8引擎隐藏类(VIP课程)

上一章我们讲了V8如何存储的对象,其中提到了隐藏类,这一章我们来看看隐藏类到底做了什么。

为什么要讲V8????

隐藏类是V8引擎在运行时自动生成和管理的数据结构,用于跟踪对象的属性和方法

隐藏类的思想借鉴了静态语言的结构

function Person (name,age) {
   this.name = name;
   this.age = age;
}
let xiaoman = new Person('小满',24)

c++

#include <iostream>
#include <string>
struct Person
{
    std::string name;
    int age;
};
int main()
{
    Person xiaoman;
    xiaoman.age = 18;
    xiaoman.name = "小满";
    std::cout << "name: " << xiaoman.name << std::endl;
    std::cout << "age: " << xiaoman.age << std::endl;
    return 0;
}

首先在JavaScript运行时,例如xiaoman.age 去查询 age 上节课我们讲过 他会 通过快慢属性 去找 而且整个过程非常耗时。

而C++就不同了,C++在声明一个对象之前需要定义该对象的结构,c++ 代码在执行之前是需要被编译的,编译的时候对象都是固定的,也就是代码执行的时候 对象的形状是无法被改变的。

所以V8就引入了 隐藏类的概念

隐藏类 (Hiden Class)

隐藏类就是把JavaScript的对象也进行静态化,我们假设这个对象不会删除和新增,这样形状就固定了

满足条件之后V8就会创建隐藏类,在这个隐藏类会创建对象的基础属性

在V8引擎中,每个隐藏类都有一个编号(map id),用于唯一标识该隐藏类

举个例子,假设我们有以下两个对象:

let obj1 = { name: 1, age: 2 }; 
let obj2 = { name: 1, age: 2, address: 3 };

这两个对象具有相同的形状,即都有属性nameage,但obj2还额外有一个属性address。V8会为它们生成两个不同的隐藏类

// 隐藏类1:包含属性name和age
HiddenClass_1
├── map_id: 1
├── property_names: ['name', 'age']
├── transitions: {}
└── prototype: Object.prototype
// 隐藏类2:包含属性name、age和address
HiddenClass_2
├── map_id: 2
├── property_names: ['name', 'age', 'address']
├── transitions:
│   ├── a: HiddenClass_1
│   ├── b: HiddenClass_1
│   └── c: null
└── prototype: Object.prototype

可以看到,隐藏类1包含属性nameage,没有过渡表;而隐藏类2包含属性nameageaddress,其中属性nameage的过渡表指向隐藏类1,属性address没有过渡表,表示该属性是新添加的

如果两个对象属性一样呢?

如果两个对象具有相同的属性,它们将共享同一个隐藏类。具体来说,当两个对象的属性顺序和类型都相同时,V8会为它们生成一个共享的隐藏类。

举个例子,假设我们有以下两个对象:

let obj1 = { name: 1, age: 2 };
let obj2 = { name: 1, age: 2 };

这两个对象具有相同的形状,即都有属性nameage,且属性的顺序和类型完全一致。V8会为它们生成一个共享的隐藏类,如下所示:

HiddenClass_1
├── map_id: 1
├── property_names: ['name', 'age']
├── transitions: {}
└── prototype: Object.prototype

可以看到,隐藏类1包含属性nameage,没有过渡表,而且两个对象都共享这个隐藏类。

这种共享隐藏类的机制可以节省内存空间,因为不同的对象可以共享相同的隐藏类结构。

目录
打赏
0
0
0
0
178
分享
相关文章
V8引擎类型转换(VIP课程)
V8引擎类型转换(VIP课程)
71 0
V8引擎编译原理(VIP课程)
V8引擎编译原理(VIP课程)
95 0
隐藏 IP 地址调用外部接口:探索与实践
隐藏 IP 地址调用外部接口:探索与实践
131 0
一篇文章教你正确解锁 代理ip 的使用方式,包含两个实战案例
本文介绍了代理IP在爬虫和网络测试中的重要性,详细讲解了代理IP的基础知识,包括定义、分类和获取方式。文章强调了正确使用代理IP的方法,如选择合适类型的代理、配置代理、轮换验证以及遵循法规。通过两个实战案例,展示了如何在爬虫中使用代理IP规避访问限制和在性能测试中模拟不同地域用户。代理IP的恰当运用能提升效率、保障安全,适应不断发展的网络环境。
1289 2
|
9月前
|
V8引擎如何存储对象(VIP课程)
V8引擎如何存储对象(VIP课程)
64 0
前端学习案例5-this指向问题-显示绑定
前端学习案例5-this指向问题-显示绑定
100 0
前端学习案例5-this指向问题-显示绑定
前端学习案例4-类组件中绑定this指向的方式
前端学习案例4-类组件中绑定this指向的方式
83 0
前端学习案例4-类组件中绑定this指向的方式
前端学习笔记202304学习笔记第六天-把组件name属性作为注册名称
前端学习笔记202304学习笔记第六天-把组件name属性作为注册名称
73 0
区块链游戏DAO模式开发步骤详情 |(源码demo实例分析)
区块链游戏的 DAO 模式开发是指利用 DAO 模式进行游戏开发和管理,其中 DAO 代表着“抵抗者”的意思。这种开发模式颠覆了传统游戏开发中的中心化管理方式,通过去除中介和减少不必要的成本来降低游戏开发的成本。
分布式学习十三:实现全局唯一id命名
分布式学习十三:实现全局唯一id命名
160 0
分布式学习十三:实现全局唯一id命名