Форум: "Прочее";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];
Внизвопрос про prototype и js Найти похожие ветки
← →
Dmitry S © (2008-01-12 19:47) [0]Определяю общий метод для всех массивов:
Array.prototype.walk = function (void_function) {
// код
}
Затем далее по скрипту создаю массив:var arr = new Array();
Кладу туда чего нибудь:arr.push("text");
А затем перечисляю:for(i in arr) {
alert(i);
}
В результате получаю два алерта:
1. "0"
2. "walk"
Вопрос: Как грамотно избавится до включения "walk" в перечисление?
← →
palva © (2008-01-12 20:11) [1]Непонятно.
Кто от чего будет избавляться. И причем здесь прототип.
← →
Ketmar_ (2008-01-12 20:18) [2]> Dmitry S © (12.01.08 19:47)
> Как грамотно избавится до включения "walk" в перечисление?
не включать walk в прототип.
← →
homm © (2008-01-12 20:29) [3]> [0] Dmitry S © (12.01.08 19:47)
Не понимаю. Ты кладешь в него "text", а в алерте получаешь "0" ?
← →
palva © (2008-01-12 20:36) [4]homm © (12.01.08 20:29) [3]
Он получает индекс. Если бы он применил for each (i in arr) он получил бы значения.
← →
homm © (2008-01-12 21:05) [5]Есть подозрение, что оператор in рассматривает arr как объект, к которому ты сам добавил поля. Нужно воспользоватся привычным циклом.
← →
Dmitry S © (2008-01-12 22:48) [6]я нашел хороший справочник по JS:
http://wdh.suncloud.ru/js07.htm#ref371
тут написано, что каждое свойство (а методы в JS - это те же свойства) может иметь атрибут DontEnum.
Есть даже метод который проверяет установлен ли этот атрибут: propertyIsEnumerable. Но нет способа задать этот атрибут.
Пока сделал так:Array.prototype.walk = function (void_function) {
for(var i in this) {
if (Array.prototype[i]==undefined) {
void_function(this[i]);
}
}
}
ИМХО это кривое решение
← →
palva © (2008-01-12 23:45) [7]А почему [5] не подошло? Типа
for(i = 0; i < arr.length(); i++) {
← →
palva © (2008-01-12 23:48) [8]Или тебе нужно, чтоб свойства массива тоже входили в перечисление?
Ты бы хоть тайные желания-то свои объяснил.
← →
Dmitry S © (2008-01-13 07:28) [9]
> А почему [5] не подошло? Типа
> for(i = 0; i < arr.length(); i++) {
К примеру:var i, s;
var arr = new Array();
arr.push("a");
arr.push("b");
arr.push("c");
arr.push("d");
arr.push("e");
delete arr[2];
s="";
for (i in arr) s += arr[i];
alert(s); // abde
s="";
for (i=0; i<arr.length; i++) s += arr[i];
alert(s); // abundefinedde
вообще моя задача написать метод, который будет применять функцию для каждого элемента массива (или ассоциированного массива, т.е. объекта).
← →
Ketmar_ (2008-01-13 12:22) [10]> Dmitry S © (13.01.08 07:28) [9]
а вот скажи, милчеловек: на кой его (метод) в прототип пихать? типа вызывать функцию с параметром — это сейчас немодно? помедитируй над [2] немного.
← →
palva © (2008-01-13 12:27) [11]
> вообще моя задача написать метод, который будет применять
> функцию для каждого элемента массива (или ассоциированного
> массива, т.е. объекта).
>
Ну то есть, надо исключить только функции. Тогда я бы написал так:for(i in arr) {
if((typeof arr[i])!="function") {...
← →
homm © (2008-01-13 12:38) [12]> [10] Ketmar_ (13.01.08 12:22)
> а вот скажи, милчеловек: на кой его (метод) в прототип пихать?
> типа вызывать функцию с параметром — это сейчас немодно?
Нет, не модно, это не ООП.
← →
Ketmar_ (2008-01-13 12:52) [13]> homm © (13.01.08 12:38) [12]
дык что интересно — возня с прототипами в JS тоже не ООП. там вообще ООП нет, его всё равно дописывать руками приходится. %-)
так что как бы автор не мучался — а модно не выйдет.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c