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)]
。