Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 25.11.2010, 14:00
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Неужели никто не пользуется этим?
Ответить с цитированием
  #3 (permalink)  
Старый 25.11.2010, 14:18
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

Сообщение от monolithed
По итогам тестов видно что нативные методы работают в разы быстрей (в Firefox точно)
И что? Неужели это важно?

Я не использую.
Ответить с цитированием
  #4 (permalink)  
Старый 25.11.2010, 15:00
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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

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

Последний раз редактировалось monolithed, 25.11.2010 в 15:05.
Ответить с цитированием
  #5 (permalink)  
Старый 25.11.2010, 15:18
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от monolithed
Мне пока не понятно зачем они тогда вообще нужны, если с ними такой геморой.
Ну так свойства чтобы были. Не могут некоторые без свойств. Мне вот и без них хорошо.
Мне непонятно скорость зачем мерить?
Ответить с цитированием
  #6 (permalink)  
Старый 25.11.2010, 16:12
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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

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

Последний раз редактировалось monolithed, 25.11.2010 в 17:10.
Ответить с цитированием
  #7 (permalink)  
Старый 25.11.2010, 21:22
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

Сообщение от monolithed
если не используете то какие у вас на это причины и планируете ли использовать их в будущем?
Кроссбраузерности нет, профита тоже нет.
Ответить с цитированием
  #8 (permalink)  
Старый 26.11.2010, 22:18
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

А началось всё с того, что кому-то вздумалось length сделать свойством, потом появилось innerHTML и пошло-поехало
Ответить с цитированием
  #9 (permalink)  
Старый 27.11.2010, 09:33
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от SV0L0CH
что кому-то вздумалось length сделать свойством
length нормальное честное свойство без сетеров и гетеров. Точнее гетера там нет никакого специального, а сетер специальный, но не для length, а для всех свойств массива.
Ответить с цитированием
  #10 (permalink)  
Старый 28.11.2010, 05:03
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

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

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

array.length+= 5

вместо

array.setLength= array.getLength() + 5
__________________
.ня
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП PHP вопрос mycoding Серверные языки и технологии 9 03.06.2010 02:57
JavaScript: ООП Ars_Art Общие вопросы Javascript 13 09.02.2010 02:32
Вопрос про ООП, цепочки прототипов. Shaci Общие вопросы Javascript 5 27.01.2010 14:50
PHP ООП и вложенные функции Tim Серверные языки и технологии 6 15.06.2009 08:01
ООП в разных браузерах? alexeews Общие вопросы Javascript 5 03.03.2009 03:08