Проблема с Prototype и классом Array

Svarog

Новичок
Проблема с Prototype и классом Array

Понадобилось использовать Prototype.

Но выяснилось, что он переопределяет класс Array и добавляет в него свои методы,
что вызывает проблемы, когда я прохожу по всем элементам массива через

for ( key in array)

В результате вместо ожидаемых значений я получаю еще и вновь добавленные методы(например, первый - "uniq [function]"

Так вопрос, можно ли как-нибудь использовать Prototype, но при этом чтобы он не трогал класс Array? Потому что переписывать код, где я использоваю перебор значание с помощью for (key in Array) совсем не хочется.

Спасибо.
 

Svarog

Новичок
Да, я понимаю, но у меня массив - ассоциативный, поэтому использовать стандартный for не получится.

Поэтому я и использовал for ( key in array).

Но теперь вот prototype подобавлял своих св-в...:(
 

Svarog

Новичок
Ссылку читал еще раньше, но ответа на свой вопрос не нашел, после чего и написал здесь. Может быть я что-то упустил?

Мне надо, чтобы

PHP:
var arr = Array();
arr['a'] = 'cool';
arr['r'] = 'test';

for ( key in arr )
    alert (arr[key]);
работало так же, как и до подключения prototype.js

То есть выводилось 'cool' и 'test'.
 

BRat

o_0
var arr = {'a':'cool', 'r':'test'}
or
var arr = new Object();
arr.a = 'cool';
arr.r = 'test';

ты же сам сказал что у тебя не массив, а а обьект
 

Svarog

Новичок
Спасибо!

Да, согласен, что я не совсем правильно выразился.
Но проблема в том, что у меня уже в большом количестве написано

var arr = Array();
arr['a'] = 'cool';
arr['r'] = 'test';

А искать эти места и переписывать совсем не хочется.
Вот в этом вся и проблема:).
 

algo

To the stars!
Ты можешь, например, проверять типа такого

for (key in arr) {
if(Array.prototype.key) continue
alert(arr[key])
}
 

Solid

Drosera anglica
algo
Вы, наверное, имели ввиду:
PHP:
if(typeof array[key] == 'function') continue;
Но хороший ли это вариант?
 

Svarog

Новичок
Solid,

я именно так проверку и сделал. Но мне этот вариант тоже не очень нравится, так как:
- приходится все-таки что-то переделывать.
- как-то некрасиво.

Поэтому буду думать дальше, может все-таки правда стоит использовать Object, а не Array.
 

algo

To the stars!
Я имел в виду такой вариант:
Код:
var arr = Array(); 
arr['a'] = 'cool'; 
arr['r'] = 'test'; 
 
for ( key in arr ) {
    if (Array.prototype[key]) continue 
    alert (key + ':' + arr[key]);
}
В предыдущем примере была опечатка в if.

Если быстродействие важно, то можно использовать код типа:

Код:
p = Array.prototype
Array.prototype = null
for ( key in arr ) {	
    alert (key + ':' + arr[key]);
}
Array.prototype = p
P.S А если быстродействие не критично, то можно это все в функцию-итератор завернуть...
 

Svarog

Новичок
algo,

спасибо, попробую.


Solid
Не устраивает тем, что есть много уже написанного кода, который совсем не хочется переделываться. К тому же один и тот же код может работать в разных местах, а иногда в этих местах prototype.js не нужен и не подключается. Поэтому использовать специфические prototype методы не хочется.
 
Сверху