使用类似行为的

时间:2015-10-10 16:04:52

标签: javascript class ecmascript-6

我正在尝试创建一个行为有点像数组的类。我希望有两件事:

  • 必须是可迭代的
  • 应该允许通过[index]访问index是一个整数
  • 的属性

使类可迭代非常简单:

class MyList {
    constructor() {
        this._list = [1, 2, 3];
    }
    [Symbol.iterator]() {
        return this._list.values();
    }
}

以上允许迭代类的实例:

let myList = new MyList();
for (let item of myList) {
    console.log(item); // prints out 1, 2, 3
}

弄清楚如何实现第二个要求并不容易,我发现的唯一想法就是扩展Array。但这意味着我必须覆盖从Array继承的大多数方法,因为我需要这些方法来做除内置行为之外的其他方法。

有没有办法实现我的要求?如果是这样,最好的办法是什么?

1 个答案:

答案 0 :(得分:4)

事实证明,您可以在类似整数的字符串键下存储属性,例如: G。 foo['0'] = 'bar'并使用整数访问它们,例如: G。 foo[0] // => bar。使用整数分配也有效。感谢@JMM指出这些东西。

因此,解决方案就像:

class Foo {
  constructor (...args) {
    for (let i = 0; i < args.length; i++) {
      this[i] = args[i];
    }
  }

  [Symbol.iterator]() {
    return Object
      .keys(this)
      .map(key => this[key])
      .values();
  }
}

const foo = new Foo('a', 'b', 'c');

for (let item of foo) {
  console.log(item); // prints out a, b, c
}

console.log(foo[1]); // prints out b

Demo