"расширить бы массив", или "расскажите как работают прототипы"
Есть следующий код:
function newObj(){
}
newObj.prototype = Array.prototype;
tt = new newObj();
tt[0] = 11;
tt[1] = 22;
alert(tt.length); // пишет 0
alert(tt[0]); // пишет 11
alert(tt[1]); // пишет 22
tt.push(99);
alert(tt.length); // пишет 1
alert(tt[0]); // пишет 99
alert(tt[1]); // пишет 22
можете объяснить такое поведение? ) |
Цитата:
tt[0] = 11; Изменеие/создание свойства объекта... Но поскольку ты занаследовался от массива (это так же объект) - у тебя есть метод push() tt.push(99); Выполнилось создание элемента массива, изменилась длина alert(tt.[0]); // пишет 99 Потому как имя свойства объекта "совпало" с первым элементом массива... Что-то такое. |
Цитата:
|
Цитата:
Тогда такой вопрос: я хочу сделать "класс" полностью повторяющий функционал массива (т.е. можно было бы устанавливать значения в массиве конструкцией вида: array[n] = val; ) + набор своих методов, но при этом не затронув нативный Array() и его прототип. Как такое реализовать? Цитата:
|
Цитата:
|
Цитата:
function MyArray() {
}
MyArray.prototype = Array.prototype;
var a = new MyArray();
a[0] = 'test'; // не работает
alert([a, a.length]);
a.push('haha'); // работает
alert([a, a.length]);
Для реализации объектов типа List (массивов) нужны как минимум магические акцессоры(getters/setters) каковых в JavaScript не существует. |
Невнимательно прочитал. Да, действительно. Можно только в браузерах, поддерживающих __proto__. Можно же создать массив и подменить его прототип на свой (кстати этот прием используется в zepto.js).
|
Цитата:
|
Можно еще создать фрейм и взять оттуда конструктор Array и делать с прототипом че угодно. Но это очень грязный трюк и вобще я так не пробовал даже )
|
Цитата:
var MyArray = document.documentElement.firstChild.appendChild(document.createElement('iframe')).contentWindow.Array;
// расширяем Array
MyArray.prototype.testFunc = function() {}
alert(new MyArray().testFunc);
alert(new Array().testFunc);
var a = new MyArray();
a[0] = 'test';
alert([a, a.length]);
|
| Часовой пояс GMT +3, время: 21:04. |