Javascript.RU

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

Из постов выше сделал вывод, что то, что я хочу сделать, сделать нельзя, т.к. в js нет возможности переопределить (наследуя) сеттер []. Верно? (
Ответить с цитированием
  #12 (permalink)  
Старый 01.08.2013, 07:55
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Вроде через ES6 Proxy можно.
Ответить с цитированием
  #13 (permalink)  
Старый 01.08.2013, 08:41
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,225

Сообщение от weeklyTea
я хочу сделать "класс" полностью повторяющий функционал массива (т.е. можно было бы устанавливать значения в массиве конструкцией вида: array[n] = val; )
Такое врядли получится... Поскольку не зря Array() назван так - он таки не Object()...
А в любой документации при наследовании используется только слово "объект"...
Ответить с цитированием
  #14 (permalink)  
Старый 01.08.2013, 10:34
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Короче сидел мудрил и вот че намудрил (работает только в Firefox)
var MyArray = function(){
    var internal = Object.create(null, {length: {value: 0, enumerable: false, writable: true}});
    var proto = MyArray.prototype;
    return Proxy.create({
        get: function(receiver, name) { 
            if (name in internal) {
                return typeof internal[name] == 'function' ? internal[name].bind(internal) : internal[name];
            }
            if (name in proto) {
                return typeof proto[name] == 'function' ? proto[name].bind(internal) : proto[name];
            }
            return undefined;
        },
        set: function(receiver, name, value) {
            if (name === 'length') {
                throw 'Not implemented';
            }
            if (!isNaN(name) && (name == +name)) {
                name = +name;
                if (internal.length <= name) {
                    internal.length = name + 1;
                }
            }
            internal[name] = value;
        }
    });
};

MyArray.prototype.push = function() {
    for (var i = 0; i < arguments.length; i++) {
        this[this.length++] = arguments[i];
    }
};

MyArray.prototype.join = function(separator) {
    var values = [];
    for (var i = 0; i < this.length; i++) {
        values.push(this[i]); 
    }
    return values.join(separator);
}

var a = new MyArray();
a.push('x','y')
console.log(a.join())
console.log(a.length)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Восторг в античной 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