Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.07.2013, 15:05
Аспирант
Отправить личное сообщение для weeklyTea Посмотреть профиль Найти все сообщения от weeklyTea
 
Регистрация: 18.12.2010
Сообщений: 42

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


можете объяснить такое поведение? )

Последний раз редактировалось weeklyTea, 31.07.2013 в 18:36.
Ответить с цитированием
  #2 (permalink)  
Старый 31.07.2013, 15:30
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,232

Сообщение от weeklyTea
можете объяснить такое поведение?
Твой tt есть объект...

tt[0] = 11;

Изменеие/создание свойства объекта...

Но поскольку ты занаследовался от массива (это так же объект) - у тебя есть метод push()

tt.push(99);

Выполнилось создание элемента массива, изменилась длина

alert(tt.[0]); // пишет 99

Потому как имя свойства объекта "совпало" с первым элементом массива...

Что-то такое.
Ответить с цитированием
  #3 (permalink)  
Старый 31.07.2013, 15:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,133

Сообщение от weeklyTea
tt.[0]
интересно как это может работать?
Ответить с цитированием
  #4 (permalink)  
Старый 31.07.2013, 18:51
Аспирант
Отправить личное сообщение для weeklyTea Посмотреть профиль Найти все сообщения от weeklyTea
 
Регистрация: 18.12.2010
Сообщений: 42

Сообщение от ksa Посмотреть сообщение
Твой tt есть объект...

tt[0] = 11;

Изменеие/создание свойства объекта...

Но поскольку ты занаследовался от массива (это так же объект) - у тебя есть метод push()

tt.push(99);

Выполнилось создание элемента массива, изменилась длина

alert(tt.[0]); // пишет 99

Потому как имя свойства объекта "совпало" с первым элементом массива...

Что-то такое.
Понял, спасибо.

Тогда такой вопрос: я хочу сделать "класс" полностью повторяющий функционал массива (т.е. можно было бы устанавливать значения в массиве конструкцией вида: array[n] = val; ) + набор своих методов, но при этом не затронув нативный Array() и его прототип. Как такое реализовать?

Сообщение от рони Посмотреть сообщение
интересно как это может работать?
Торопился, и точку лишней написал (
Ответить с цитированием
  #5 (permalink)  
Старый 31.07.2013, 19:20
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от weeklyTea
Как такое реализовать?
Так и реализуй. А в чем сложность возникла?
Ответить с цитированием
  #6 (permalink)  
Старый 31.07.2013, 19:30
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от danik.js
Так и реализуй. А в чем сложность возникла?
сложность тут в том что это работать не будет
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 не существует.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #7 (permalink)  
Старый 31.07.2013, 19:34
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Невнимательно прочитал. Да, действительно. Можно только в браузерах, поддерживающих __proto__. Можно же создать массив и подменить его прототип на свой (кстати этот прием используется в zepto.js).
Ответить с цитированием
  #8 (permalink)  
Старый 31.07.2013, 19:40
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от danik.js
Можно только в браузерах, поддерживающих __proto__
вот именно, а это значит что ИЕ7-8-9-10 в пролете, но вот ИЕ11 уже поддерживает свойство __proto__, хоть оно и не стандартное, но мелкософт решил его добавить в ИЕ11
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #9 (permalink)  
Старый 31.07.2013, 19:44
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Можно еще создать фрейм и взять оттуда конструктор Array и делать с прототипом че угодно. Но это очень грязный трюк и вобще я так не пробовал даже )
Ответить с цитированием
  #10 (permalink)  
Старый 31.07.2013, 19:56
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от danik.js
Но это очень грязный трюк и вобще я так не пробовал даже
ну это да, извращение конечно)))
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]);
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Восторг в античной ForYourself ювелирные изделия тибетской или дать как подарок whistle123 Events/DOM/Window 0 03.12.2012 10:09
Переменная от переменной или как к имени переменной конкатенировать значение другой Aderba jQuery 5 12.11.2008 15:25
Подскажите как убрать часть текста при нажатии на кномпу или гиперссылку. potkin Общие вопросы Javascript 6 10.10.2008 07:55
Как узнать свернуто окно браузера или нет. bar-boss Events/DOM/Window 3 25.09.2008 16:09
Как переместиться в начало страницы или к закладке? f_gor Общие вопросы Javascript 2 03.09.2008 23:00