翼度科技»论坛 编程开发 JavaScript 查看内容

JavaScript内存管理——隐藏类

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
根据JavaScript所在的运行环境,有时候需要根据JavaScript引擎采取不同的性能优化策略。如果代码非常注重性能,那么隐藏类对我们是非常重要的。比如以下的代码:
  1. function User() {
  2.     this.name = "User Name";
  3. }
  4. let user1 = new User();
  5. ler user2 = new User();
复制代码
在上面的代码中我们创建了一个User类,JavaScript引擎会让user1,user2这两个类实例共享一个隐藏类,因为这两个类实例共享同一个构造函数和原型。我们继续往下添加以下代码:
  1. user2.age = 18;
复制代码
此时两个不同的类实例会对应两个不同的隐藏类,根据这类操作的频率和隐藏类的大小会对性能产生明显影响。
解决方案就是避免JavaScript的“先创造后补充”(ready-fire-aim)式的动态属性赋值,并在构造函数中一次性声明所有属性,如下所示:
  1. function User(age) {
  2.     this.name = "User name";
  3.     this.age = age;
  4. }
  5. let user1 = new User();
  6. let user2 = new User(18);
复制代码
这样两个类实例就基本一致了,可以共享一个隐藏类。
注意:使用delete关键字会导致生成相同的隐藏类片段。
  1. function User() {
  2.   this.name = "User name";<br>  this.age = 18;
  3. }
  4. let user1 = new User();
  5. let user2 = new User();
  6. delete user2.age;
复制代码
在这之后就算两个类实例使用了同一个构造函数,它们也不再共享一个隐藏类。最佳解决方法就是把不想要的属性设置为null。这样可以保持隐藏类继续共享不变,同时也能达到删除引用值供垃圾回收机制回收的效果。

来源:https://www.cnblogs.com/zousi/p/17810444.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具