#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. цель может быть использована вместо себя, я думаю, они показывают строгое равенство цели === я