Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ООП: Getters & Setters (https://javascript.ru/forum/misc/13301-oop-getters-setters.html)

monolithed 24.11.2010 23:04

ООП: 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 25.11.2010 14:00

Неужели никто не пользуется этим?

Kolyaj 25.11.2010 14:18

Итоги тестов непонятны.

Цитата:

Сообщение от monolithed
По итогам тестов видно что нативные методы работают в разы быстрей (в Firefox точно)

И что? :) Неужели это важно?

Я не использую.

monolithed 25.11.2010 15:00

Цитата:

Сообщение от Kolyaj
И что? Неужели это важно?

Мне пока не понятно зачем они тогда вообще нужны, если с ними такой геморой.
Если к примеру Object.defineProperty(), Object.isSealed(), Object.isFrozen() реально здорово что появились, то
__defineGetter__/__defineSetter__ и set/get нафига они нужны?!
Хоть синтаксис не уродовали бы тогда. А то получается JavaPythonScript какой-то..... :D

Цитата:

Сообщение от Kolyaj
Я не использую.

Я тоже.

Kolyaj 25.11.2010 15:18

Цитата:

Сообщение от monolithed
Мне пока не понятно зачем они тогда вообще нужны, если с ними такой геморой.

Ну так свойства чтобы были. Не могут некоторые без свойств. Мне вот и без них хорошо.
Мне непонятно скорость зачем мерить? :)

monolithed 25.11.2010 16:12

Цитата:

Сообщение от Kolyaj
Мне непонятно скорость зачем мерить?

Ну как:-? , не много не понял вопроса)) Из таких мелочей и складывается общее время выполнения кода и его производительность

Kolyaj Я просто хочу услышать мнение других относительно использования этих методов, если не используете то какие у вас на это причины и планируете ли использовать их в будущем?

Kolyaj 25.11.2010 21:22

Цитата:

Сообщение от monolithed
Из таких мелочей и складывается общее время выполнения кода и его производительность

Из таких мелочей максимум может сложиться миллисекунда на несколько тысяч кода. Да и эта миллисекунда не будет наблюдаться, т.к. все эти тысячи кода не выполняются за один заход.

Цитата:

Сообщение от monolithed
если не используете то какие у вас на это причины и планируете ли использовать их в будущем?

Кроссбраузерности нет, профита тоже нет.

SV0L0CH 26.11.2010 22:18

А началось всё с того, что кому-то вздумалось length сделать свойством, потом появилось innerHTML и пошло-поехало :(

Kolyaj 27.11.2010 09:33

Цитата:

Сообщение от SV0L0CH
что кому-то вздумалось length сделать свойством

length нормальное честное свойство без сетеров и гетеров. Точнее гетера там нет никакого специального, а сетер специальный, но не для length, а для всех свойств массива.

tenshi 28.11.2010 05:03

какая разница какая скорость?

профит простой:

array.length+= 5

вместо

array.setLength= array.getLength() + 5


Часовой пояс GMT +3, время: 11:11.