为什么我不能覆盖字符串实例的迭代器而不是String.prototype?
这段代码允许使用扩展运算符来分割句子的单词,正如预期的那样:
String.prototype[Symbol.iterator] = function* () {
yield* this.split(' ');
}
const result = [...'The quick brown fox jumped over the lazy dog.'];
console.log(result);
回答
因为字符串原语不是字符串对象。相反,当您对它们使用方法(或访问它们的属性)时,就好像它们首先被转换为对象。(在松散模式下,实际上创建了一个对象,但是当方法返回时该对象被丢弃,除非某些东西保留对它的引用。)这意味着这段代码修改了一个永远不会保存的临时对象(不是字符串原语;字符串原语是不可变的):
sentence[Symbol.iterator] = function* () {
yield* this.split(' ');
}
sentence[Symbol.iterator] = function* () {
yield* this.split(' ');
}
由于它从未保存过,以后当您使用迭代器时,您将获得默认值。
您可以改为创建一个字符串对象:
您可以words在字符串上定义自己的方法:
const sentence = new String('The quick brown fox jumped over the lazy dog.');
// ??????????????^^^^^^^^^^^???????????????????????????????????????????????^
sentence[Symbol.iterator] = function* () {
yield* this.split(' ');
};
const result = [...sentence];
console.log(result);
我强烈反对修改库或类似库中的内置原型,但如果您意识到未来命名冲突等的危险,您可以在自己的页面或应用程序上进行。
或者正如VLAZ 指出的那样,只需编写一个将字符串传递给的函数。:-)
THE END
二维码