Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   "расширить бы массив", или "расскажите как работают прототипы" (https://javascript.ru/forum/misc/40318-rasshirit-massiv-ili-rasskazhite-kak-rabotayut-prototipy.html)

weeklyTea 01.08.2013 07:04

Из постов выше сделал вывод, что то, что я хочу сделать, сделать нельзя, т.к. в js нет возможности переопределить (наследуя) сеттер []. Верно? (

danik.js 01.08.2013 07:55

Вроде через ES6 Proxy можно.

ksa 01.08.2013 08:41

Цитата:

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

Такое врядли получится... Поскольку не зря Array() назван так - он таки не Object()...
А в любой документации при наследовании используется только слово "объект"...

danik.js 01.08.2013 10:34

Короче сидел мудрил и вот че намудрил (работает только в 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)


Часовой пояс GMT +3, время: 06:47.