"расширить бы массив", или "расскажите как работают прототипы"
Есть следующий код:
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, время: 19:53. |