如何扩展regexp对象

时间:2017-02-11 16:59:28

标签: javascript oop

我创建了一个类,可以在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扩展时,它都按预期工作。

1 个答案:

答案 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"

请注意,扩展内置原型是有争议的,至少有两个阵营,一个说“永远不会那样,你会遇到麻烦”,另一个说“这就是原型的用途”。从实用的角度来看,要注意命名冲突 - 与其他代码一起扩展本机原型,以及随着语言及其运行时的发展,将来会添加基类型。