Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   "За" и "против" библиотек работы с DOM и пр. (https://javascript.ru/forum/offtopic/15348-za-i-protiv-bibliotek-raboty-s-dom-i-pr.html)

FINoM 23.03.2011 16:28

По сути я просто хочу повторить эффект jQuery, вызывать некую функцию (например, $), передавать туда htmlnode или nodelist, и вызывать методы работающие с содержимым параметра, с возможностью не лезя в код библиотеки добавить новые методы.

Matre 23.03.2011 16:30

Цитата:

а как в таком случае писать плагины?
function $(...) {
	var r = {};
	...
	for (var i in $.prototype)
		r[i] = $.prototype[i];
	...
}

$.prototype.ddd = function () {...};


В-общем, бред.
А чем же Вам неугодны обычные прототипы?

FINoM 23.03.2011 16:33

Цитата:

Сообщение от Matre
А чем же Вам неугодны обычные прототипы?

Говорят, что создание методов для встроенных классов Javascript - плохо. Я стараюсь следовать общепринятым стандартам.
Цитата:

Сообщение от Matre
В-общем, бред.

А может нет?

Matre 23.03.2011 16:34

Каждый раз заново инициализировать методы для каждого объекта — вот это плохо.

FINoM 23.03.2011 16:36

Точно.
Значит вопрос еще актуален.

Спасибо.

Matre 23.03.2011 16:40

Тут всё просто. Перегоняем массив в создаваемый функцией объект, а в плагинах работаем с ним как с обычным массивом:

function $(...) {
	return new $.init(...);
}
$.init = function (...) {
	var I = 0;
	for (...)
		this[I++] = ...
	this.length = I;
};
$.prototype.plugin = function () {
	for (var i = 0; i < this.length; i++) ...
};

Kolyaj 23.03.2011 16:56

Цитата:

Сообщение от FINoM
зачем в функцию передавать undefined в качестве аргумента

Защита от перезаписи переменной undefined.

Цитата:

Сообщение от FINoM
Говорят, что создание методов для встроенных классов Javascript - плохо. Я стараюсь следовать общепринятым стандартам.

"Говорят" и "общепринятые стандарты" немножко разные вещи.

FINoM 23.03.2011 17:55

Matre, круто, спасибо. Только зачем это: this.length = I; ? Понимаю, если бы нужно было очищать список от излишних узлов, но функция $ вызывается единожды, при создании списка узлов, а фильтровать и модифицировать элементы списка будем через методы.
И зачем создавать методы $ через prototype? $.plugin не прокатит?
Цитата:

Сообщение от Kolyaj
Защита от перезаписи переменной undefined.

А что мешает её переопределить?
Цитата:

Сообщение от Kolyaj
"Говорят" и "общепринятые стандарты" немножко разные вещи

Единственным оправданием для расширения встроенных прототипов может быть только воссоздание возможностей более новых движков JavaScript, например функции Array.forEach, которая появилась в версии 1.6. http://shamansir.github.com/JavaScri...ject.prototype
Не знаю как это позиционировать, но возьму себе за правило.

Matre 23.03.2011 18:11

Цитата:

Только зачем это: this.length = I; ?
Потому что this — объект, а не массив, у него нет свойства length. А как же Вы собираетесь перебирать такой объект? Удобнее ведь работать с ним как с обычным массивом, нежели перебирать через for..in

Цитата:

И зачем создавать методы $ через prototype? $.plugin не прокатит?
Не прокатит. this, например, будет в такой функции вообще ссылаться на $.

Kolyaj 23.03.2011 18:12

Цитата:

Сообщение от FINoM
А что мешает её переопределить?

Ничто не мешает, поэтому и защищаются.

Цитата:

Сообщение от FINoM
Единственным оправданием для расширения встроенных прототипов может быть только воссоздание возможностей более новых движков JavaScript

Второе -- удобство использования.


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