我创建了一个类,可以在regexp对象(https://github.com/valorize/MultiRegExp2)中获取组的所有开始和结束位置。我想用这个新的"类"来包装最初的正则表达式。并添加一个新方法execForAllGroups
。我怎么能这样做/覆盖旧的正则表达式,但仍然使用它的所有功能,如搜索,测试等。?
我有:
function MultiRegExp2(baseRegExp) {
let filled = fillGroups(baseRegExp);
this.regexp = filled.regexp;
this.groupIndexMapper = filled.groupIndexMapper;
this.previousGroupsForGroup = filled.previousGroupsForGroup;
}
MultiRegExp2.prototype = new RegExp();
MultiRegExp2.prototype.execForAllGroups = function(string) {
let matches = RegExp.prototype.exec.call(this.regexp, string);
...
修改: 感谢T.J. Crowder我改编了ES6类语法并扩展了RegExp:
class MultiRegExp extends RegExp {
yourNiftyMethod() {
console.log("This is your nifty method");
}
}
But
let rex = new MultiRegExp(); // rex.constructor.name is RegExp not MultiRegExp
rex.yourNiftyMethod(); // returns: rex.yourNiftyMethod is not a function
当我从String或其他Object扩展时,它都按预期工作。
答案 0 :(得分:2)
你至少有几个选择。我可以看到你正在使用ES2015(又名ES6)功能,最明显的做法是扩展RegExp
:
class MultiRegExp2 extends RegExp {
yourNiftyMethod() {
console.log("This is your nifty method");
}
}
let rex = new MultiRegExp2(/\w+/); // or = new MultiRegExp2("\\w+");
console.log(rex.test("testing")); // "true"
rex.yourNiftyMethod(); // "This is your nifty method"
或者,您只需添加到RegExp
即可扩充内置RegExp.prototype
类型:
RegExp.prototype.yourNiftyMethod = function() {
console.log("This is your nifty method");
};
let rex = /\w+/;
console.log(rex.test("testing")); // "true"
rex.yourNiftyMethod(); // "This is your nifty method"
请注意,扩展内置原型是有争议的,至少有两个阵营,一个说“永远不会那样,你会遇到麻烦”,另一个说“这就是原型的用途”。从实用的角度来看,要注意命名冲突 - 与其他代码一起扩展本机原型,以及随着语言及其运行时的发展,将来会添加基类型。