Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 23.03.2011, 16:28
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

По сути я просто хочу повторить эффект jQuery, вызывать некую функцию (например, $), передавать туда htmlnode или nodelist, и вызывать методы работающие с содержимым параметра, с возможностью не лезя в код библиотеки добавить новые методы.
Ответить с цитированием
  #12 (permalink)  
Старый 23.03.2011, 16:30
Профессор
Отправить личное сообщение для Matre Посмотреть профиль Найти все сообщения от Matre
 
Регистрация: 07.01.2011
Сообщений: 582

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

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


В-общем, бред.
А чем же Вам неугодны обычные прототипы?
Ответить с цитированием
  #13 (permalink)  
Старый 23.03.2011, 16:33
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Сообщение от Matre
А чем же Вам неугодны обычные прототипы?
Говорят, что создание методов для встроенных классов Javascript - плохо. Я стараюсь следовать общепринятым стандартам.
Сообщение от Matre
В-общем, бред.
А может нет?
Ответить с цитированием
  #14 (permalink)  
Старый 23.03.2011, 16:34
Профессор
Отправить личное сообщение для Matre Посмотреть профиль Найти все сообщения от Matre
 
Регистрация: 07.01.2011
Сообщений: 582

Каждый раз заново инициализировать методы для каждого объекта — вот это плохо.
Ответить с цитированием
  #15 (permalink)  
Старый 23.03.2011, 16:36
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

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

Спасибо.
Ответить с цитированием
  #16 (permalink)  
Старый 23.03.2011, 16:40
Профессор
Отправить личное сообщение для Matre Посмотреть профиль Найти все сообщения от Matre
 
Регистрация: 07.01.2011
Сообщений: 582

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

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++) ...
};
Ответить с цитированием
  #17 (permalink)  
Старый 23.03.2011, 16:56
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

Сообщение от FINoM
Говорят, что создание методов для встроенных классов Javascript - плохо. Я стараюсь следовать общепринятым стандартам.
"Говорят" и "общепринятые стандарты" немножко разные вещи.
Ответить с цитированием
  #18 (permalink)  
Старый 23.03.2011, 17:55
Аватар для FINoM
Новичок
Отправить личное сообщение для FINoM Посмотреть профиль Найти все сообщения от FINoM
 
Регистрация: 05.09.2010
Сообщений: 2,298

Matre, круто, спасибо. Только зачем это: this.length = I; ? Понимаю, если бы нужно было очищать список от излишних узлов, но функция $ вызывается единожды, при создании списка узлов, а фильтровать и модифицировать элементы списка будем через методы.
И зачем создавать методы $ через prototype? $.plugin не прокатит?
Сообщение от Kolyaj
Защита от перезаписи переменной undefined.
А что мешает её переопределить?
Сообщение от Kolyaj
"Говорят" и "общепринятые стандарты" немножко разные вещи
Единственным оправданием для расширения встроенных прототипов может быть только воссоздание возможностей более новых движков JavaScript, например функции Array.forEach, которая появилась в версии 1.6. http://shamansir.github.com/JavaScri...ject.prototype
Не знаю как это позиционировать, но возьму себе за правило.
Ответить с цитированием
  #19 (permalink)  
Старый 23.03.2011, 18:11
Профессор
Отправить личное сообщение для Matre Посмотреть профиль Найти все сообщения от Matre
 
Регистрация: 07.01.2011
Сообщений: 582

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

Цитата:
И зачем создавать методы $ через prototype? $.plugin не прокатит?
Не прокатит. this, например, будет в такой функции вообще ссылаться на $.
Ответить с цитированием
  #20 (permalink)  
Старый 23.03.2011, 18:12
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от FINoM
А что мешает её переопределить?
Ничто не мешает, поэтому и защищаются.

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



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

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