我有一个包装数组的 JavaScript 类。班级看起来像这样。
class Store {
constructor() {
this._store = [];
}
}
我正在尝试定义一个
Symbol.iterator
,因此可以使用例如for (... of ...)
循环来迭代类实例。
该类的设计方式是,
_store
参数可以是null
。我按照此定义 Symbol.iterator
函数的解决方案如下
class Store {
...
[Symbol.iterator]() {
return (this._store || [])[Symbol.iterator]();
}
}
其背后的想法是,如果
_store
包含一个数组,则此代码将返回 _store[Symbol.iterator]
,否则它将返回空数组的迭代器。
如果
console.log
-ged,则以下表达式似乎是一个函数,正如预期的那样。
console.log( (this._store || [])[Symbol.iterator] )
但是,一旦调用该函数,就会抛出以下错误,该错误指向调用该函数的代码。
TypeError: Cannot convert undefined or null to object
对于为什么会发生这种情况有什么想法吗?
如果您确保使用正确的
this
值调用迭代器函数,那么它就可以正常工作:
class Store {
_store;
constructor(arr) {
this._store = arr;
}
[Symbol.iterator]() {
const dummy = [];
const iterator = this._store?.[Symbol.iterator]?.bind(this._store) ??
dummy[Symbol.iterator].bind(dummy);
return iterator();
}
}
let store1 = new Store(["hello", "world"]);
for (let s of store1) console.log("store: " + s);
let store2 = new Store();
for (let s of store2) console.log("store 2: " + s);