У меня есть простой класс ES6, например:
class Ring extends Array {
insert (item, index) {
this.splice(index, 0, item);
return this;
}
}
Я хочу сделать так, чтобы индексация объектов Ring переносилась, чтобы new Ring(1, 2, 3)[3]
возвращала 1, new Ring(1, 2, 3)[-1]
возвращала 3 и так далее. Возможно ли это в ES6? Если да, то как бы я это реализовал?
Я читал о прокси, которые позволяют полностью настроить геттер, но я не могу понять, как применить прокси к классу. Я справился с этим:
var myRing = new Proxy (Ring.prototype, {
get: function (target, name) {
var len = target.length;
if (/^-?\d+$/.test(name))
return target[(name % len + len) % len];
return target[name];
}
});
myRing
теперь является кольцевым объектом, поддерживающим перенос индексов. Проблема в том, что мне пришлось бы каждый раз определять объекты Ring подобным образом. Есть ли способ применить этот прокси к классу, чтобы вызов new Ring()
возвращал его?
new Proxy (...)
функцией-конструктором и вызовите ее с помощьюnew
. Да, вы не можете сделать это без прокси. - person Estus Flask   schedule 01.10.2016