Показать сообщение отдельно
  #1 (permalink)  
Старый 24.11.2010, 23:04
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

ООП: Getters & Setters
В начале этого года активно писали статьи на тему появления новых методов/свойств в 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 точно)

Последний раз редактировалось monolithed, 24.11.2010 в 23:57.
Ответить с цитированием