Классы ES6 реализуют индексатор, подобный массивам

#javascript #python #node.js #list #equivalent

Вопрос:

Я хочу реализовать индексатор для получения элементов из свойства данных с индексом в виде массивов JavaScript. Я слышал о прокси-серверах ES6, но не смог реализовать их в своем классе. Возможно ли это сейчас или мне следует подождать больше, чтобы выйти с ES7.

 class Polygon {
    constructor() {
        this.data = new Set(arguments)
    }

    [Symbol.iterator](){
        return this.data[Symbol.iterator]()
    }

    add(vertex){
        this.data.add(vertex)
    }

    remove(vertex){
        this.data.delete(vertex)
    }

    get perimeter(){

    }

    get area(){

    }
}

let poly = new Polygon()
let first_vertex = poly[0]
 

Комментарии:

1. почему бы вам просто не подклассить массив?

2. @the8472, который может работать неправильно при использовании транспилятора. Также присвоение позволило бы дублировать значения, в отличие от использования Set в вопросе.

3. Я предположил, что пример был просто игрушечным примером, потому что было бы довольно неэффективно фактически выполнять подсчитанную итерацию по набору, чтобы получить N-й элемент

4. @Справедливая точка зрения 8472. Согласен, однако, что подклассы массива теперь являются приемлемым вариантом

Ответ №1:

AFAIK нет предложения о чем-то вроде «индексирования» на произвольные объекты, так что да, вам придется использовать прокси.

Я не мог действительно проверить это, так как ни одна среда, похоже, не поддерживает как классы, так и прокси-серверы, но теоретически вам придется возвращать новый проксированный объект из конструктора. Протестировано в Chrome v52.

Пример:

 class Test {
  constructor(data) {
    let self = this;
    this.data = data;
    this.foo = 'bar';

    return new Proxy(this, {
      get(target, prop) {
        if (Number(prop) == prop amp;amp; !(prop in target)) {
          return self.data[prop];
        }
        return target[prop];
      }
    });
  }
}

var test = new Test([1,2,3]);
console.log(test[0]); // should log 1
console.log(test.foo); // should log 'bar'
 

Комментарии:

1. ДА. это именно то поведение, которого я хочу. Знаете ли вы какую-либо платформу, которая поддерживает прокси es6?

2. Firefox, похоже, поддерживает прокси-серверы, но не class синтаксис. Однако вы можете попробовать это с помощью обычных функций конструктора.

3. Я проверял ваш пример кода с firefox каждую ночь, и он работает, как и ожидалось. Теперь я хотел бы видеть эту поддержку в node.js как можно скорее. Спасибо @FelixKling

4. цель может быть использована вместо себя, я думаю, они показывают строгое равенство цели === я