Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 28.03.2013, 12:36
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 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 ) );
Ответить с цитированием
  #22 (permalink)  
Старый 28.03.2013, 13:21
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 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.
Ответить с цитированием
  #23 (permalink)  
Старый 28.03.2013, 14:29
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 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 );
Ответить с цитированием
  #24 (permalink)  
Старый 28.03.2013, 21:20
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

недавно плагин жукверевский к Zepto подключал. Ой намучался

по теме: я вижу только такое решение
var box = {
    method: function() {
      alert( 1 )
    }
};

var arr = [];
arr.method = box.method;

arr.method();

В данном случае просто устанавливаются ссылки на функцию. Т.е. функция не создается заново каждый раз.

p.s.: тред особо не читал
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #25 (permalink)  
Старый 28.03.2013, 21:48
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от danik.js
И добавляя метод в прототип мы автоматом получаем его у уже созданных экземпляров
это зло вообще-то

могу еще вариант предложить с аппедиксом

var arr = [];

arr.some = {}; // тут твой мега объект, в нем ссылка на родителя (arr)


но это все через ж*пу и проще сделать нормальный объект
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #26 (permalink)  
Старый 28.03.2013, 22:33
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

nerv_, видимо больше ничего не остается. Тут чел то же самое предлагает: https://github.com/madrobby/zepto/pu...mment-15571557
Сообщение от nerv_
Ой намучался
Впринципе для плагинов нехватает методов (inner|outerWidth, fade* (но есть модуль), slide*). Еще одна серьезная проблема - расширенные селекторы (хотя ведь можно их избегать). Плюс некоторые различия (тип коллекции zepto - массив, а не объект, коллекция не является инстансом $ и т.д.)
Ответить с цитированием
  #27 (permalink)  
Старый 28.03.2013, 22:36
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от nerv_
это зло вообще-то
Почему зло? Плагины ведь расширяют прототип. Хотя как правило они подключаются в первую очередь. Но ведь никто не запрещает..

<script>
$el = $('.el');
</script>
<script src="plugin.js"></script>
<script>
$el.plugin() // без прототипа  - беда!
</script>
Ответить с цитированием
  #28 (permalink)  
Старый 28.03.2013, 23:05
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от danik.js
Почему зло?
я имел ввиду злоупотребление: создали объект, работаем с ним, добавили новый метод в прототип, появился в объекте - это не есть гуд на мой взгляд

я не понял зачем тебе тема с прототипом, т.к. плагины для зепто пишутся также как и для жуквери:
$.fn.some = function() {


почему намучался. зепто не полностью совместим с жуквери. В частности, когда я подключал плагин-шаблонизатор к зепто, мне пришлось лезть в код этого плагина - раз, два - дописывать для зепто и подключать плагин, эмулирующий метод жуквери, кот. нет в зепто
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #29 (permalink)  
Старый 28.03.2013, 23:40
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Нужно пофиксить коллекции zepto и дописать $.prototype = $.fn. Тогда останутся только проблемы отсутствия методов, которые легко решить и проблема расширенных селекторов, от которых народ нужно отучать.
Хотя есть и другие проблемы.. Тот же data(), который полноценен только через модуль. Есть и другие проблемы..

Тут циклическая зависимость - зепто не используют в качестве замены jQuery => его особенности не принимают во внимание => зепто не используют...
Ответить с цитированием
  #30 (permalink)  
Старый 28.03.2013, 23:50
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от danik.js
Нужно пофиксить коллекции zepto
не понял, что ты имеешь ввиду

Сообщение от danik.js
и дописать $.prototype = $.fn
зачем?

Сообщение от danik.js
Тот же data()
его я и писал если нужно, могу ссылку дать

Сообщение от danik.js
его особенности не принимают во внимание
скорее одни особенности (жуквери) накладываются на другие (зепто) при попытке использовать зепто
Сообщение от danik.js
в качестве замены jQuery
как результат приходиться лезть в исходники обоих библиотек, чтобы понять, как оно работает и фиксить, фиксить, фиксить
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать массив функций (?) venzh jQuery 1 02.02.2012 06:11
Как создать массив из картинок KamalovRadik Firefox/Mozilla 17 04.10.2011 14:06
Создать массив не содержащие данные другого масива KamalovRadik Общие вопросы Javascript 1 05.09.2011 03:30
Подскажите код как создать эффект... lopraeph Элементы интерфейса 1 09.06.2011 20:18
как создать елемент с вложеными елементами scuter Events/DOM/Window 11 14.05.2008 16:15