Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как создать массив с особым прототипом? (https://javascript.ru/forum/misc/36783-kak-sozdat-massiv-s-osobym-prototipom.html)

Octane 29.03.2013 00:04

А че из ифрейма достать другой конструктор не вариант?
(function () {
	var iFrame = document.createElement("iframe"), iFrameDoc;
	document.body.appendChild(iFrame);
	iFrameDoc = iFrame.contentDocument || iFrame.contentWindow.document;
	iFrameDoc.open();
	iFrameDoc.write('<script>window.Array = Array</scr' + 'ipt>');
	iFrameDoc.close();
	window.$Array = (iFrame.contentWindow || iFrameDoc.defaultView).Array;
}());

$Array.prototype.test = function () {};

var array = [], $array = new $Array();

alert([
	"test" in array,
	"test" in $array,
	Array.isArray ? Array.isArray($array) : "",
	Object.prototype.toString.call($array),
	new $Array(1, 2, 3).concat(4)
]);

danik.js 29.03.2013 00:13

Цитата:

Сообщение от nerv_
не понял, что ты имеешь ввиду

Например в fancybox увидел проверку if ($.type($el) == 'object') { .. }
Но для zepto type = 'array'. Проверка не проходит. И это кривизна zepto.
Цитата:

Сообщение от nerv_
зачем?

Там же увидел if ($el instanceof $) { ... }
Опять же, для zepto это не сработает.

Aetae 29.03.2013 00:41

Цитата:

Сообщение от rgl (Сообщение 243117)
Aetae,
Только функция должна быть чуть посложнее - нужно отсекать дробные числа, слишком большие числа, и много чего еще:

Ну я и не претендовал на окончательность - просто пример.)
Кстати по поводу больших чисел - просто наш псеводомассив круче нативного. ))


Цитата:

Сообщение от Octane (Сообщение 243213)
А че из ифрейма достать другой конструктор не вариант?

Ну да, забыли об энтом варианте. Но тут свои подводные камни, ибо энтот $array уже не instance от Array. Да и грязно это, юзать стоит только если задача стоит "добиться N любой ценой".)

nerv_ 29.03.2013 01:27

Цитата:

Сообщение от danik.js
Там же увидел if ($el instanceof $) { ... }
Опять же, для zepto это не сработает

в зепто для этого есть специальный метод
$.zepto.isZ( some );

Цитата:

Сообщение от danik.js
Например в fancybox увидел проверку if ($.type($el) == 'object') { .. }
Но для zepto type = 'array'. Проверка не проходит.

ради интереса проверил
var x = $( 'div' );

alert( $.type( x ) == 'array' ); // true
alert( $.type( x ) === 'array' ); // и так тоже true

danik.js 29.03.2013 10:01

Octane, блин, круто! Это действительно делает то, что мне нужно. Но это конечно очень грязный хак. Я не уверен что его можно использовать.
А есть еще подобные вариации для получения другого Array ?
Цитата:

Сообщение от Aetae
$array уже не instance от Array

Так это понятно. Это и отражает суть задачи - прототипы должны быть разными. Следовательно мы не будем иметь instance от Array.

Цитата:

Сообщение от nerv_
в зепто для этого есть специальный метод

Я вкурсе. Но jquery-плагинам это неизвестно )
Цитата:

Сообщение от nerv_
alert( $.type( x ) == 'array' ); // true

Я о чем и говорю. Коллекция zepto - массив. Коллекция jquery - объект.
В плагинах бывает проверка через $.type и поведение jquery и zepto тут будет разным.

nerv_ 29.03.2013 12:42

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

Цитата:

Сообщение от danik.js
Я вкурсе. Но jquery-плагинам это неизвестно )

не проще поиск и замена по регулярному выражению внутри плагина, чем вся эта акробатика?

megaupload 29.03.2013 13:09

danik.js,
это еще чо , мы тогда пытались функции с другим прототипом получать вот это было весело)

danik.js 29.03.2013 13:49

Цитата:

Сообщение от nerv_
не проще поиск и замена по регулярному выражению внутри плагина, чем вся эта акробатика?

Правки плагинов - это ведь и есть акробатика. Не проще ли раз и навсегда устранить различия между jquery и zepto ? Нет ведь принципиальных проблем сделать это.

nerv_ 29.03.2013 14:17

Цитата:

Сообщение от danik.js
Не проще ли раз и навсегда устранить различия между jquery и zepto ?

проще использовать жуквери. Или жуквери 2.0 :) А если устранить различия (полностью, как ты хочешь), то вместо зепто мы получим жуквери.

Могу еще пример привести: когда пытался подключить жуквери плагин к зепто, оказалось, что в зепто нет метода pushStack.

danik.js 29.03.2013 15:48

Цитата:

Сообщение от nerv_
А если устранить различия (полностью, как ты хочешь)

Пффф. Почему полностью?
Дописать $.prototype = перед $.fn - это всего 12 символов
Ну с коллекциями будет чуть сложнее, но правок будет не так уж и много. На уровне ядра больше ничего править то и не нужно (наверное). С чего ты взял что после этих правок zepto станет jquery?
Это не кучи говна ради совместимости с IE6, не миллионы оберток, исправляющие недочеты быдлокодеров, css-анимация никуда не денется. Selector engine не добавится.
В общем я знаю две вещи:
1) нужно по возможности использовать Zepto. Ибо работает быстрее, грузится быстрее, и не содержит тонны мертвого кода. А ишак( IE8- ) пускай хавает jQuery.
2) при желании можно писать плагины, совместимые как с jQuery, так и с Zepto. И это не так уж и сложно.


Часовой пояс GMT +3, время: 10:40.