Est*_*ask 7 javascript google-chrome v8
特定
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;
}
});
Run Code Online (Sandbox Code Playgroud)
使用getter/setter函数
obj.aSetter(2);
obj.aGetter();
Run Code Online (Sandbox Code Playgroud)
与直接属性访问相比,Chrome/V8性能会降低一些(~3x):
obj._a = 2;
obj._a;
Run Code Online (Sandbox Code Playgroud)
这是可以理解的.并使用描述符getter/setter
obj.a = 2;
obj.a;
Run Code Online (Sandbox Code Playgroud)
将导致Chrome(41到最新)性能下降约30倍 - 几乎与Proxy.虽然Firefox和较旧的Chrome版本使用描述符getter/setter而没有显着的性能损失.
在最近的Chrome/V8版本中,描述符getter/setter性能的确切问题是什么?这是一个可以监控的已知问题吗?
测量使用Benchmark.js(jsPerf引擎)完成.我无法提供jsPerf测试的链接来可视化差异,因为jsPerf已经严重搞砸了它的反DDoS措施,但我确信现有的可以证明一点.
性能的变化与这个Chromium问题有关(学分转到@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);
Run Code Online (Sandbox Code Playgroud)
或者使用ES6语法糖:
class Obj {
constructor() {
this._a = 1;
}
get a() {
return this._a;
}
set a(val) {
this._a = val;
}
}
let obj = new Obj();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2803 次 |
| 最近记录: |