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;
}
}
}
|
|
21.05.2012, 16:45
|
|
Аспирант
|
|
Регистрация: 21.05.2012
Сообщений: 89
|
|
Я пишу код понятный для меня. Как мне удобно. Какой смысл писать весь код в сточку, а потом когда он работать не будет, копаться в соей писанине в поиске ошибок?
|
|
21.05.2012, 18:25
|
sinistral
|
|
Регистрация: 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 /*массив ключей*/;
};
ты каждый раз при обращении к методу итерируешь свойства. но ты бы мог из перебирать только в исключительных случах, вроде замены всех элементов. при добавлении нового он добавляется к кэшу элементов. результат ? в разы повышается производительность.
|
|
21.05.2012, 19:03
|
|
''
|
|
Регистрация: 11.12.2011
Сообщений: 636
|
|
Сообщение от melky
|
ты каждый раз при обращении к методу итерируешь свойства. но ты бы мог из перебирать только в исключительных случах, вроде замены всех элементов. при добавлении нового он добавляется к кэшу элементов. результат ? в разы повышается производительность.
|
А что быстрее, хранить имена всех свойств в массиве и когда нужно делать перебор циклом for, или юзать for-in
|
|
21.05.2012, 19:22
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Раед
|
А что быстрее, хранить имена всех свойств в массиве и когда нужно делать перебор циклом for, или юзать for-in
|
Hash.prototype.keys возвращает массив. не нужно делать перебор.
for по массиву быстрее, чем for-in по объекту.
|
|
22.05.2012, 21:17
|
sinistral
|
|
Регистрация: 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 на больших данных? что голословить...
|
|
22.05.2012, 22:05
|
|
''
|
|
Регистрация: 11.12.2011
Сообщений: 636
|
|
Ещё такой вопрос: что считаете правильнее, использовать замыкания или _доверится _соглашению _программистов?
|
|
22.05.2012, 22:52
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Раед
|
Ещё такой вопрос: что считаете правильнее, использовать замыкания или _доверится _соглашению _программистов?
|
тут надо всё взвесить. лучшего варианта нет.
- устойчивость кода к воздействиям извне
замыканияесли код не дает возможности изменить её, то её не изменить, т.е. устойчивость высокая. соглашениеможно изменить, как и любое свойство (конечно, если не запретить изменение\конфигурировани свойства в дескрипторе)
- простота использования
замыкания
новичкам бывает трудно понять замыкания. после осознавания сути они становятся обычным приёмом
соглашение
легче, чем замыкание. тут присутствует сходство с обычным ООП.
- сжимаемость кода
замыканияотлично сжимаются, как обычные локальные переменные соглашение
после сжатия в GCC в advanced mode могут возникнуть проблемы, если такие приватные свойства будут переименовываться минификатором.
если сохранять имена - то может страдает качество сжатия кода.
я, вероятно, не всё учел. пишите, может быть, добавлю в ФАК .
Последний раз редактировалось melky, 22.05.2012 в 22:54.
|
|
22.05.2012, 22:54
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Maxmaxmахimus
|
Лучше, только потом конструктор не забывай поправлять.
|
что скажите на этот счет? (от поста по ссылке, до конца темы)
Функция inherit для эмуляции Object.create(proto)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
22.05.2012, 23:54
|
|
''
|
|
Регистрация: 11.12.2011
Сообщений: 636
|
|
Сообщение от Maxmaxmахimus
|
смотря какой паттерн юзаешь
|
Хороший вопрос.. Определить бы
|
|
|
|