Показать сообщение отдельно
  #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. Причина: Добавление решения проблемы.
Ответить с цитированием