2017-02-11 44 views
1

我創建了一個類,可以獲取正則表達式對象中的所有組的開始和結束位置(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.克勞德我適應了ES6類語法和擴展正則表達式:

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 

當我從字符串或其他對象的所有作品延伸的預期。

回答

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"

請注意,擴展內置原型是有爭議的,至少有兩個陣營,一個說「永遠不會這樣做,你會遇到麻煩」,另一個說「這是原型是爲了」。從實用的角度來看,請注意命名衝突  —其他代碼也擴展了原生原型,並隨着語言及其運行時的演變而增加了基本類型。

+0

我喜歡用類擴展RegExp的想法,但是我得到:'Uncaught TypeError:rex.yourNiftyMethod不是函數' – velop

+0

鑑於文章http://v8project.blogspot.de/2017/01/speeding-up -v8-regular-expressions.html也許最好將正則表達式保存爲屬性並創建手槽方法? 'test(str){return this.regex.test(str); }'? – velop

+1

@velop:也許,或許這是過早的微觀優化。 :-)但有趣的文章。如果需要超級性能,一旦Chrome 57發佈,您可能需要兩種方式進行測試。 ([此頁面](https://en.wikipedia.org/wiki/Google_Chrome_version_history)表明,Chrome Canary可能已經在使用該版本的V8。) –