我有一个简单的ES6类,如下所示:
class Ring extends Array {
insert (item, index) {
this.splice(index, 0, item);
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
我想这样做,以便Ring对象的索引包装,所以new Ring(1, 2, 3)[3]返回1,new Ring(1, 2, 3)[-1]返回3,依此类推.这可能在ES6中吗?如果是这样,我将如何实现它?
我已经阅读了代理,它允许完全自定义的getter,但我无法弄清楚如何将代理应用于类.我确实管理了这个:
var myRing = new Proxy (Ring.prototype, {
get: function (target, name) {
var len = target.length;
if (/^-?\d+$/.test(name))
return target[(name % len + len) % len];
return target[name];
}
});
Run Code Online (Sandbox Code Playgroud)
myRing现在是一个支持包装索引的Ring对象.问题是我每次都必须定义像这样的Ring对象.有没有办法将此代理应用于类,以便调用new Ring()返回它?
我正在编写一个函数来递归替换字符串中正则表达式的匹配.替换可以是一个函数,就像vanilla一样.replace,此函数可以通过其中一个参数访问原始字符串.
我希望我的函数在每次迭代时只替换一个匹配.对于非全局正则表达式,情况总是如此.但是,此函数接收的一些正则表达式将是全局的.做一个传统.replace(regex, replacement)意味着它可以在每次迭代中多次替换,不仅搞乱处理匹配的顺序,而且还将不正确的索引和原始字符串传递给替换函数.
举个例子:
function recursiveReplace(string, regex, replacement) {
for (var i = 1e8; i > 0 && regex.test(string); i--)
string = string.replace(regex, replacement);
return string;
}
console.log(
recursiveReplace("abcdef", /../g, function (match, index, original) {
console.log(original);
return match[0];
})
);
Run Code Online (Sandbox Code Playgroud)
这输出
abcdef
abcdef
abcdef
ace
ae
a
Run Code Online (Sandbox Code Playgroud)
当所需的输出是
abcdef
acdef
adef
aef
af
a
Run Code Online (Sandbox Code Playgroud)
我怎样才能让函数在每次迭代时只处理一个匹配,无论正则表达式是否有g标志?请注意,我正在以这样的方式使用该函数,即第二个参数将始终是正则表达式(我无法控制它,也无法控制所述正则表达式是否具有该g标志).