28.03.2013, 12:36
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Сообщение от danik.js
|
А то, что length не обновляется - это не беда. Работа с коллекцией всеравно идет через методы, а не напрямую.
|
Так что все-таки надо, массив? Методы массива? Коллекция массивом не является. А свойство length важно не только само по себе, оно необходимо чтобы правильно работали методы массива:
Сообщение от rgl
|
Дело в том, что у полученного объекта отсутствует свойство length (точнее оно присутствует, но не свое, а наследуемое, а там оно ноль). Из-за этого методы массива не работают.
|
Вот, например:
var test = {};
test[0] = "a";
test[1] = "bb";
test[2] = "ccc";
test.length = 2;
alert( Array.prototype.slice.call( test, 0 ) );
|
|
28.03.2013, 13:21
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,584
|
|
Если уж извращаться - то можно эмулировать геттером, они вроде в ие 9+ поддерживаются уже. Примерно так, если не думать об оптимизации):
var test = {
get length(){
var j = 0;
for(var i in this)if(!isNaN(i) && i > j) j = +i ;
return j+1
}
};
test[0] = "a";
test[1] = "bb";
test[25] = "ccc";
alert(test.length)
alert( Array.prototype.slice.call( test, 0 ) );
__________________
29375, 35
Последний раз редактировалось Aetae, 28.03.2013 в 13:24.
|
|
28.03.2013, 14:29
|
|
Профессор
|
|
Регистрация: 28.02.2011
Сообщений: 349
|
|
Aetae,
Только функция должна быть чуть посложнее - нужно отсекать дробные числа, слишком большие числа, и много чего еще:
var test = {
get length(){
var j = 0;
for(var i in this)if(!isNaN(i) && i > j) j = +i ;
return j+1
}
};
test[0] = "a";
test[1] = "bb";
test[1e100] = "ccc";
var test2 = [];
test2[0] = "a";
test2[1] = "bb";
test2[1e100] = "ccc";
alert( test.length + " | " + test2.length );
|
|
28.03.2013, 21:20
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
недавно плагин жукверевский к Zepto подключал. Ой намучался
по теме: я вижу только такое решение
var box = {
method: function() {
alert( 1 )
}
};
var arr = [];
arr.method = box.method;
arr.method();
В данном случае просто устанавливаются ссылки на функцию. Т.е. функция не создается заново каждый раз.
p.s.: тред особо не читал
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
28.03.2013, 21:48
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от danik.js
|
И добавляя метод в прототип мы автоматом получаем его у уже созданных экземпляров
|
это зло вообще-то
могу еще вариант предложить с аппедиксом
var arr = [];
arr.some = {}; // тут твой мега объект, в нем ссылка на родителя (arr)
но это все через ж*пу и проще сделать нормальный объект
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
28.03.2013, 22:33
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
nerv_, видимо больше ничего не остается. Тут чел то же самое предлагает: https://github.com/madrobby/zepto/pu...mment-15571557
Сообщение от nerv_
|
Ой намучался
|
Впринципе для плагинов нехватает методов (inner|outerWidth, fade* (но есть модуль), slide*). Еще одна серьезная проблема - расширенные селекторы (хотя ведь можно их избегать). Плюс некоторые различия (тип коллекции zepto - массив, а не объект, коллекция не является инстансом $ и т.д.)
|
|
28.03.2013, 22:36
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от nerv_
|
это зло вообще-то
|
Почему зло? Плагины ведь расширяют прототип. Хотя как правило они подключаются в первую очередь. Но ведь никто не запрещает..
<script>
$el = $('.el');
</script>
<script src="plugin.js"></script>
<script>
$el.plugin() // без прототипа - беда!
</script>
|
|
28.03.2013, 23:05
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от danik.js
|
Почему зло?
|
я имел ввиду злоупотребление: создали объект, работаем с ним, добавили новый метод в прототип, появился в объекте - это не есть гуд на мой взгляд
я не понял зачем тебе тема с прототипом, т.к. плагины для зепто пишутся также как и для жуквери:
$.fn.some = function() {
почему намучался. зепто не полностью совместим с жуквери. В частности, когда я подключал плагин-шаблонизатор к зепто, мне пришлось лезть в код этого плагина - раз, два - дописывать для зепто и подключать плагин, эмулирующий метод жуквери, кот. нет в зепто
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
28.03.2013, 23:40
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Нужно пофиксить коллекции zepto и дописать $.prototype = $.fn. Тогда останутся только проблемы отсутствия методов, которые легко решить и проблема расширенных селекторов, от которых народ нужно отучать.
Хотя есть и другие проблемы.. Тот же data(), который полноценен только через модуль. Есть и другие проблемы..
Тут циклическая зависимость - зепто не используют в качестве замены jQuery => его особенности не принимают во внимание => зепто не используют...
|
|
28.03.2013, 23:50
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от danik.js
|
Нужно пофиксить коллекции zepto
|
не понял, что ты имеешь ввиду
Сообщение от danik.js
|
и дописать $.prototype = $.fn
|
зачем?
Сообщение от danik.js
|
Тот же data()
|
его я и писал если нужно, могу ссылку дать
Сообщение от danik.js
|
его особенности не принимают во внимание
|
скорее одни особенности (жуквери) накладываются на другие (зепто) при попытке использовать зепто
Сообщение от danik.js
|
в качестве замены jQuery
|
как результат приходиться лезть в исходники обоих библиотек, чтобы понять, как оно работает и фиксить, фиксить, фиксить
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|