Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.01.2012, 17:37
Аватар для inst
Аспирант
Отправить личное сообщение для inst Посмотреть профиль Найти все сообщения от inst
 
Регистрация: 12.01.2012
Сообщений: 44

Унаследовать Array
Добрый день.

Почитал о наследовании в JavaScript. Вкратце, захотел сделать List, который мог бы фильтровать добавляемые в него данные, при этом весь функционал чтобы повторял обычный Array. Вот к чему пришёл:
util.List = function () {
	Array.apply(this, arguments);
};
util.List.prototype = new Array();
util.List.prototype.move = function (from, to) {
	if (typeof from === 'string') {
		from = Number(from);
	}
	if (typeof to === 'string') {
		to = Number(to);
	}
	if (typeof to !== 'number' ||
	   (typeof to === 'number' && isNaN(to))
	   ) {
		return false;
	}
	if (typeof from !== 'number' ||
	   (typeof from === 'number' && isNaN(from))
	   ) {
		return false;
	}

	if (typeof this['onMove'] === 'function') {
		if (this.onMove(from, to) === false) {
			return false;
		}
	}

	var tmp = this.splice(from, 1);
	this.splice(to, 0, tmp);
	return this;
};
proxyFn = function (obj, fn, args) {
	var fnUCase = fn.charAt(0).toUpperCase() + fn.slice(1),
		result;
	if (typeof obj['on' + fnUCase] === 'function') {
		if (obj['on' + fnUCase].apply(obj, args) === false) {
			return false;
		}
	}
	result = Array[fn].apply(obj, args);
	if (typeof result === 'undefined') {
		return true;
	} else {
		return result;
	}
};
util.List.prototype.push = function () { return proxyFn(this, 'push', arguments); };
util.List.prototype.shift = function () { return proxyFn(this, 'shift', arguments); };
util.List.prototype.join = function () { return proxyFn(this, 'join', arguments); };
util.List.prototype.concat = function () { return proxyFn(this, 'concat', arguments); };
util.List.prototype.splice = function () { return proxyFn(this, 'splice', arguments); };
util.List.prototype.pop = function () { return proxyFn(this, 'pop', arguments); };
util.List.prototype.unshift = function () { return proxyFn(this, 'unshift', arguments); };
util.List.prototype.slice = function () { return proxyFn(this, 'slice', arguments); };
util.List.prototype.reverse = function () { return proxyFn(this, 'reverse', arguments); };
util.List.prototype.sort = function () { return proxyFn(this, 'sort', arguments); }
Думал, после этого будет достаточно:
var lst = new util.List();
lst.push(1);
lst.push(2);
lst.push(3);
Но
console.log(lst);
не показывает никаких данных внутри объекта, кроме определённых выше функций.

Вопрос: В JavaScript нельзя унаследовать массив?

UPDATE: Ошибка была в строчке 41. Должно быть так:
result = Array.prototype[fn].apply(obj, args);

Последний раз редактировалось inst, 26.01.2012 в 19:36. Причина: Добавление решения проблемы.
Ответить с цитированием
  #2 (permalink)  
Старый 26.01.2012, 17:45
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

можно
Ответить с цитированием
  #3 (permalink)  
Старый 26.01.2012, 17:48
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от inst Посмотреть сообщение
В JavaScript нельзя унаследовать массив?
Что значит унаследовать массив? Массив это набор данных, его не наследуют.

Что такое:
new lt.util.List();
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #4 (permalink)  
Старый 26.01.2012, 17:48
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Что такое List?
Ответить с цитированием
  #5 (permalink)  
Старый 26.01.2012, 18:02
Аватар для inst
Аспирант
Отправить личное сообщение для inst Посмотреть профиль Найти все сообщения от inst
 
Регистрация: 12.01.2012
Сообщений: 44

Сообщение от Gozar Посмотреть сообщение
Что такое:
new lt.util.List();
Извините, опечатка, в посте исправил. Но проблема не в ней.

Сообщение от Gozar Посмотреть сообщение
Что значит унаследовать массив? Массив это набор данных, его не наследуют.
В JavaScript же всё - объекты. И Array - не исключение. Я не сам массив хочу унаследовать, а его функционал.
Ответить с цитированием
  #6 (permalink)  
Старый 26.01.2012, 18:03
Аватар для inst
Аспирант
Отправить личное сообщение для inst Посмотреть профиль Найти все сообщения от inst
 
Регистрация: 12.01.2012
Сообщений: 44

Сообщение от Livaanderiamarum Посмотреть сообщение
Что такое List?
Всё в посте.
Ответить с цитированием
  #7 (permalink)  
Старый 26.01.2012, 18:03
Аватар для inst
Аспирант
Отправить личное сообщение для inst Посмотреть профиль Найти все сообщения от inst
 
Регистрация: 12.01.2012
Сообщений: 44

Сообщение от Livaanderiamarum Посмотреть сообщение
можно
А почему тогда данные не добавляются по push?
Ответить с цитированием
  #8 (permalink)  
Старый 26.01.2012, 18:04
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Сообщение от inst Посмотреть сообщение
Всё в посте.
Прочитав пост задаю вопрос, что такое лист и что он должен делать? но за грубый ответ помогать не буду и вопрос снимаю
Ответить с цитированием
  #9 (permalink)  
Старый 26.01.2012, 18:10
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

var A = function(){};
A.prototype = [];
var a = new A;
a.push('vasea', 'test');
alert(a);
alert((Array.isArray || function(o){Object.prototype.toString.call(o) == '[object Array]'})(a));


В общем такое можно, но только в новых браузерах. IE<9 не проканает, хотя есть и свои хаки.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #10 (permalink)  
Старый 26.01.2012, 18:15
Аватар для inst
Аспирант
Отправить личное сообщение для inst Посмотреть профиль Найти все сообщения от inst
 
Регистрация: 12.01.2012
Сообщений: 44

Сообщение от Livaanderiamarum Посмотреть сообщение
Прочитав пост задаю вопрос, что такое лист и что он должен делать?
Ну, я же указал в начале поста:
Цитата:
List, который мог бы фильтровать добавляемые в него данные
Т.е. это такой объект, создав экземпляр которого, я бы мог получить доступ ко всем функциям массива (например, push), определить функцию onPush(), которая бы вызывалась перед непосредственно добавлением данных и служила в качестве фильтра, пропуская или нет добавляемые данные.

Как пример:
var list = new List();
list.onPush = function(data) {
if (typeof data !== 'number') {
return false;
}
return true;
}
Затем:
list.push('строка'); // и эта строка не добавится
list.push(777); // а с число - добавится
list.push(function() {}); // и ничего кроме цифр туда не добавишь

В результате в list должен добавиться только один элемент:
list[0] == 777;
Как-то так.

Сообщение от Livaanderiamarum Посмотреть сообщение
но за грубый ответ помогать не буду и вопрос снимаю
Я и не думал грубить.
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать сохранение списков select? sega_z Элементы интерфейса 8 15.05.2011 18:01
PHP to JS Array Pumych Events/DOM/Window 8 10.02.2011 22:30
Ошибка function is not defined KamaZz Общие вопросы Javascript 19 28.09.2010 14:38
Метод remove() в стандартном Array voyager ExtJS 11 08.09.2010 16:04
Многомерный массив в json Л_Денис Общие вопросы Javascript 1 21.04.2010 21:43