Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 21.05.2012, 16:32
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Maxmaxmахimus,
А не лучше ли прототип объектом присвоить.
/**
 * Переключатель.
 * Имеет 2 состояния.
 * Если включен, то возвращает хранимое значение,
 * если выключен, то возвращает undefined.
 * По умолчанию включен
 *
 * @param value - значение
 * @constructor
 */
function Toggle ( value ) {
    this._state = true;
    this._value = value;
}
Toggle.prototype = {
 on : function() {
    this._state = true;
 },
 off : function () {
    this._state = false;
 },
 toggle : function () {
    this._state = !this._state;
 },
 state : function () {
    return this._state;
 },
 value : function ( value ) {
 
    if (  arguments.length < 0 ) {
        this._value = value;
    }
    else if ( this._state ) {
        return this._value;
    }
 }
}
Ответить с цитированием
  #12 (permalink)  
Старый 21.05.2012, 16:45
Аватар для Джэксон
Аспирант
Отправить личное сообщение для Джэксон Посмотреть профиль Найти все сообщения от Джэксон
 
Регистрация: 21.05.2012
Сообщений: 89

Я пишу код понятный для меня. Как мне удобно. Какой смысл писать весь код в сточку, а потом когда он работать не будет, копаться в соей писанине в поиске ошибок?
Ответить с цитированием
  #13 (permalink)  
Старый 21.05.2012, 18:25
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Maxmaxmахimus Посмотреть сообщение
Так же приходится фиксить конструктор.
<...>
то накладывает впечатление не правильного использования системы прототипов.
поясни и первое, и второе.

что тут не так ?

function a(b){ 
  this.b = b; this.scream(); 
}

a.prototype = { 
  scream: function(){
    alert(this.b + ", World!")
  } 
};

new a("Hello");

Сообщение от Maxmaxmахimus Посмотреть сообщение
То есть ЛУЧШЕ для производительности ?? да. Лучше вообще все в одну строку написать, или вообще сразу бинарниками писать)
код из твоего примера:
Hash.prototype.keys = function () {
	var elements = this._elements,
		keys = [];

	for ( var key in elements ) if ( elements.hasOwnProperty( key ) ) {
		keys.push( key );
	}

	return /*массив ключей*/;
};

ты каждый раз при обращении к методу итерируешь свойства. но ты бы мог из перебирать только в исключительных случах, вроде замены всех элементов. при добавлении нового он добавляется к кэшу элементов. результат ? в разы повышается производительность.
Ответить с цитированием
  #14 (permalink)  
Старый 21.05.2012, 19:03
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от melky
ты каждый раз при обращении к методу итерируешь свойства. но ты бы мог из перебирать только в исключительных случах, вроде замены всех элементов. при добавлении нового он добавляется к кэшу элементов. результат ? в разы повышается производительность.
А что быстрее, хранить имена всех свойств в массиве и когда нужно делать перебор циклом for, или юзать for-in
Ответить с цитированием
  #15 (permalink)  
Старый 21.05.2012, 19:22
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Раед Посмотреть сообщение
А что быстрее, хранить имена всех свойств в массиве и когда нужно делать перебор циклом for, или юзать for-in
Hash.prototype.keys возвращает массив. не нужно делать перебор.

for по массиву быстрее, чем for-in по объекту.
Ответить с цитированием
  #16 (permalink)  
Старый 22.05.2012, 21:17
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Maxmaxmахimus
melky,
ну во первых я уже писал что я просто забыл удалить лишнее

return Object.getOwnPropertyNames( this._elements );
если ты на серъёзе собираешься оставить эту строчку, то IE7, IE8, Opera будут срать кирпичами при каждом вызове keys.


Сообщение от Maxmaxmахimus
Так же нет свойства lenght которое бы постоянно изменялось, есть метод count, то есть когда НУЖНО, то можешь посчитать количество элементов и закэшировать. В остальыне же моменты на это ресурсы не тратятся.
Ы. тут ситуация такая же, как и у свойства length у массивов в старых браузерах (напомню, он не кешировался)
Сообщение от Maxmaxmахimus
операций по получению ключей меньше чем операций с работой с элементами хэша.
return cached_keys;
// vs
for(i in elements) keys.push(i);
return keys;

ты так думаешь? "просто вернуть" и "перебрать".
Сообщение от Maxmaxmахimus
Или когда НУЖНО просто ПОСЧИТАТЬ эти ключи.
у тебя все операции с элементами сделаны через высокоуровневые методы. при добавлении элемента просто увеличиваешь цифру количества элементов на один.
Сообщение от Maxmaxmахimus
что лучше ВСЕГДА кэшировать ключи. При любых операциях дергать этот кэш.
при добавлении добавляешь в кэш. при удалении - удаляешь. это все операции с изменением кеша.

PS. а давай протестируем Hash на больших данных? что голословить...
Ответить с цитированием
  #17 (permalink)  
Старый 22.05.2012, 22:05
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Ещё такой вопрос: что считаете правильнее, использовать замыкания или _доверится _соглашению _программистов?
Ответить с цитированием
  #18 (permalink)  
Старый 22.05.2012, 22:52
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Раед Посмотреть сообщение
Ещё такой вопрос: что считаете правильнее, использовать замыкания или _доверится _соглашению _программистов?
тут надо всё взвесить. лучшего варианта нет.
  • устойчивость кода к воздействиям извне
    замыкания
    если код не дает возможности изменить её, то её не изменить, т.е. устойчивость высокая.
    соглашение
    можно изменить, как и любое свойство (конечно, если не запретить изменение\конфигурировани свойства в дескрипторе)
  • простота использования
    замыкания

    новичкам бывает трудно понять замыкания. после осознавания сути они становятся обычным приёмом
    соглашение

    легче, чем замыкание. тут присутствует сходство с обычным ООП.
  • сжимаемость кода
    замыкания
    отлично сжимаются, как обычные локальные переменные
    соглашение

    после сжатия в GCC в advanced mode могут возникнуть проблемы, если такие приватные свойства будут переименовываться минификатором.
    если сохранять имена - то может страдает качество сжатия кода.
я, вероятно, не всё учел. пишите, может быть, добавлю в ФАК .

Последний раз редактировалось melky, 22.05.2012 в 22:54.
Ответить с цитированием
  #19 (permalink)  
Старый 22.05.2012, 22:54
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Maxmaxmахimus
Лучше, только потом конструктор не забывай поправлять.
что скажите на этот счет? (от поста по ссылке, до конца темы)

Функция inherit для эмуляции Object.create(proto)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #20 (permalink)  
Старый 22.05.2012, 23:54
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от Maxmaxmахimus
смотря какой паттерн юзаешь
Хороший вопрос.. Определить бы
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Введенный код в prompt() falsenull Общие вопросы Javascript 8 21.05.2012 16:47
Получить код js-скрипта, находящегося в файле на сервере RomanA Общие вопросы Javascript 4 04.04.2012 09:53
код нe работает в фаирфохе dadli Javascript под браузер 2 28.01.2012 21:18
Типографика и HTML код Manjuriano (X)HTML/CSS 3 23.11.2011 12:22
Как узнать динамический код страницы? gosha13 Общие вопросы Javascript 5 27.07.2009 13:31