Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

вопрос про 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
11-1183307342
Rusya
2007-07-01 20:29
2008.02.10
Тики в тракбаре


6-1179287240
-=Germe$=-
2007-05-16 07:47
2008.02.10
HTTP запрос средствами WinSock


11-1183728247
Stan
2007-07-06 17:24
2008.02.10
Баг - Undeclared identifier: @@chk_other_KEYMSGS


15-1199318746
radium
2008-01-03 03:05
2008.02.10
Какой диск выбрать в качестве системного?


2-1200224535
Lotse
2008-01-13 14:42
2008.02.10
Вопрос о работе программы вне среды Delphi