В начале этого года активно писали статьи на тему появления новых методов/свойств в ES5 и пр. Но больше всего для меня стало не понятным введение "встроенных" геттеров-сеттеров. По ряду причин (не родной синтаксис, не кроссбраузерность и пр.), я отложил/забил на них и вот сейчас решил опять попробовать понять рациональность их использования.
Я провел небольшие тесты, в порядке возрастания/времени выполнения. Хочу услышать ваше мнение.
//Стандартные геттеры:
function Foo(bar) {
this._bar = bar;
};
Foo.prototype = {
setBar : function (bar) {
this._bar = bar;
},
getBar : function () {
return this._bar;
}
};
var foo = new Foo;
foo.setBar('hello world!');
alert(foo.getBar());
//Foo - 0.006ms
//setBar() - 0.004ms
//getBar() - 0.003ms
//ИТОГО: 0.013
//Стандартные геттеры:
function Foo(bar) {
var _bar = bar;
this.bar = function (bar) {
if (arguments.length) {
_bar = bar;
}
else {
return _bar;
}
}
};
var foo = new Foo;
foo.bar('hello world!');
alert(foo.bar());
//Foo - 0.008ms
//bar() - 0.013ms //два вызова
//ИТОГО: 0.021
//Через объект:
function Foo(bar) {
this._bar = bar;
};
Foo.prototype = {
set bar (bar) {
this._bar = bar;
},
get bar () {
return this._bar;
}
};
var foo = new Foo;
foo.bar = 'hello world!';
alert(foo.bar);
//Foo - 0.006ms
//(?) - 0.004ms
//(?) - 0.004ms
//ИТОГО: 0.024
//Через методы __defineGetter__ и __defineSetter__:
function Foo(bar) {
var _bar = bar;
this.__defineGetter__("bar", function(){
return _bar;
});
this.__defineSetter__("bar", function(val){
_bar = bar;
});
};
var foo = new Foo('hello world!');
alert(foo.bar);
//Foo - 0.026ms
//(?) - 0.011ms
//(?) - 0.004ms
//ИТОГО: 0.041
По итогам тестов видно что нативные методы работают в разы быстрей (в Firefox точно)