Добрый день.
Почитал о наследовании в 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);