当前位置: 首页 > 知识库问答 >
问题:

最近的Chrome/V8版本中的对象描述符getter/setter性能

越景天
2023-03-14

鉴于

var obj = {};

var _a = 1;

obj._a = 1;

obj.aGetter = function() {
  return _a;
}

obj.aSetter = function(val) {
  _a = val;
}

Object.defineProperty(obj, 'a', {
  enumerable: true,
  get: function () {
    return _a;  
  },
  set: function(val) {
    _a = val;
  }     
});

使用getter/setter函数

obj.aSetter(2);
obj.aGetter();

与直接属性访问相比,Chrome /V8性能会有所下降(~3倍):

obj._a = 2;
obj._a;

这是可以理解的。使用描述符getter/setter

obj.a = 2;
obj.a;

将导致 Chrome(从 41 到最新)性能降低约 30 倍 - 几乎与代理一样慢。虽然火狐和较旧的Chrome版本使用描述符获取器/二进制数,但没有显着的性能损失。

在最近的Chrome/V8版本中,描述符getter/setter性能的确切问题是什么?这是一个可以监控的已知问题吗?

测量是用Benchmark.js (jsPerf引擎)完成的。我无法提供jsPerf测试的链接来直观显示差异,因为jsPerf的反DDoS措施已经严重出错,但我相信现有的措施可以证明这一点。

共有1个答案

国盛
2023-03-14

性能的变化与铬问题有关(信用证转到@VyacheslavEgorov)。

为了避免性能问题,应该使用原型。这是为什么单例类可以用来实例化一个对象的原因之一。

使用ES5:

var _a = 1;

function Obj() {}

Object.defineProperty(Obj.prototype, 'a', {
  enumerable: true,
  get: function () {
    return _a;  
  },
  set: function(val) {
    _a = val;
  }     
});

var obj = new Obj();
// or
var obj = Object.create(Obj.prototype);

或与ES6语法糖:

class Obj {
  constructor() {
    this._a = 1;
  }

  get a() {
    return this._a;
  }

  set a(val) {
    this._a = val;
  }     
}

let obj = new Obj();
 类似资料:
  • 概述 JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。 下面是属性描述对象的一个例子。 { value: 123, writable: false, enumerable: true,

  • 有两种类型的对象属性。 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor properties)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 Getter 和 setter 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get

  • 一般来说,一个描述器是一个有“绑定行为”的对象属性 (object attribute),它的访问控制被描述器协议方法重写。 这些方法是 __get__(), __set__() , 和 __delete__() 。 有这些方法的对象叫做描述器。 默认对属性的访问控制是从对象的字典里面 (__dict__) 中获取 (get) , 设置 (set) 和删除 (delete) 。 举例来说, a.x

  • 问题内容: 如何在JavaScript中模拟PHP风格的__get()和__set()魔术获取器/设置器?许多人说这目前是不可能的。我几乎可以肯定,这是有可能的,因为像nowjs(http://nowjs.com)这样的项目会做这样的事情。 我知道您可以利用get和set,但是当您不确定属性名称是什么时,这些将无法使用。例如, 如果您希望在创建新属性时执行事件处理程序,该 怎么办? 我想做的例子:

  • 本文向大家介绍Python中的类与对象之描述符详解,包括了Python中的类与对象之描述符详解的使用技巧和注意事项,需要的朋友参考一下 描述符(Descriptors)是Python语言中一个深奥但却重要的一部分。它们广泛应用于Python语言的内核,熟练掌握描述符将会为Python程序员的工具箱添加一个额外的技巧。为了给接下来对描述符的讨论做一些铺垫,我将描述一些程序员可能会在日常编程活动中遇到

  • 利用 getter/setter 可以拦截操作对象的属性,在设置属性前或获取属性前做一些事情。 1. getter get语法将对象属性绑定到查询该属性时将被调用的函数。(MDN) // 语法 var 对象 = { get 属性名() { // 做一些事情 balabala return 值; } }; getter 在获取一个属性时被调用,同时返回 getter 的返回