Javascript 创建具有类似数组行为的ES6类

Javascript 创建具有类似数组行为的ES6类,javascript,class,ecmascript-6,Javascript,Class,Ecmascript 6,我试图创建一个行为有点像数组的类。我想要两样东西: 必须是可忍受的 应允许通过[index]访问属性,其中index是一个整数 使类可移植相当容易: class MyList { constructor() { this._list = [1, 2, 3]; } [Symbol.iterator]() { return this._list.values(); } } 上面允许迭代类的实例: let myList = new

我试图创建一个行为有点像数组的类。我想要两样东西:

  • 必须是可忍受的
  • 应允许通过
    [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
继承的大多数方法,因为我需要这些方法来执行内置行为以外的其他操作


有没有办法达到我的要求?如果是这样,那么最好的方法是什么呢?

事实证明,您可以将属性存储在类似字符串键的整数下,例如。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
class-Foo{
构造函数(…参数){
for(设i=0;ithis[key])
.values();
}
}
const foo=新foo('a','b','c');
用于(出租foo项目){
console.log(item);//打印出a、b、c
}
console.log(foo[1]);//打印出b

.

是否需要
var test=MyList();试验[2]=1导致
[未定义,未定义,2]
测试。长度
3
?或者仅仅是数据可以被
[]
?@t.niese访问这一点很重要吗?我想不是,我没有想过:)为什么要使用
\u list
来存储数据,而不是直接与对象一起存储:
this[idx]=2
而不是
this.\u list[idx]=2
。你不想这么做有什么原因吗?@t.niese-hmmm,这其实是个好问题。这只是一个例子,这是我之前实现的方式,我将值存储在私有属性上(我正在使用Typescript,我意识到JS中此时没有私有属性)。但是我认为直接将其存储在类中应该是可以的。听起来您需要一个
代理来截取赋值。它应该是
foo[0]='bar'
。只要它们保持同步,这种通用方法就会起作用。只要在内部数组中添加/删除/修改一个元素,更改就会反映到
这个[n]
道具上。“它应该是
foo[0]='bar'
”--这不是我在代码中所做的吗?我说的是我直接从你的答案中引用的部分:
foo['0']='bar'
”这不是一个语法或运行时错误,只是一些没有意义去做或鼓励的事情。例如,您可以同样毫无意义地编写
foo[(0)]