이것은 일반 exec 메소드 호출에 대한 편의성을 제공합니다. 예를 들어 Firefox에서 regex("string")은 regex.exec("string")과 동일합니다. 이 기능이 ES4 사양에 추가될 것이라는 ECMAScript 4 제안이 있었지만 나중에 ES4-discuss 메일링 리스트 토론에서 이 제안이 폐기되었을 수 있습니다.
그러나 RegExp.prototype에 call 및 apply 메소드를 추가하면 이러한 메소드를 유사하게 구현할 수 있습니다. 이는 기능적 디자인에 도움이 될 뿐만 아니라 함수와 정규식 모두에 유효한 오리 유형 코드의 구현을 가능하게 합니다. 이제 이러한 메서드를 추가해 보겠습니다.
RegExp.prototype.call = 함수(컨텍스트) , str) {
return this.exec(str);
};
RegExp.prototype.apply = function(context, args) {
return this.exec(args[0]);
};
위의 두 메서드는 컨텍스트 매개 변수를 완전히 무시하므로 null 또는 다른 개체를 컨텍스트로 제출할 수 있으며 일반 exec 메서드의 반환 값도 유사하게 가져옵니다. 위의 방법을 사용하면 어떤 상황에서도 정규식과 함수를 정상적으로 사용하는 것이 훨씬 쉬워집니다. 이와 같은 몇 가지 명백한 예는 JavaScript 1.6의 배열 반복에 유용합니다. 다음은 필터, 모든, 일부, >map 메소드는 여러 브라우저에서 실행될 수 있습니다.
var results = [];
for (var i = 0; i < this.length; i ) {
if (i in this && func.call(context, this[i ], i, this))
results.push(this[i]);
return results.prototype.every) {
// 배열의 각 요소가 제공된 테스트 함수를 만족하면 true를 반환합니다.
Array.prototype.every = function (func, context) {
for (var i = 0; i < this.length; i ) {
if (i in this && !func.call( context, this[i], i, this))
return false;
return true
if (!Array.prototype.some) {
// true를 반환합니다. 배열의 하나 이상의 요소가 제공된 테스트 함수를 만족하는 경우.
Array.prototype.some = function (func, context) {
for (var i = 0; i < this.length; i ) {
if (i in this && func.call(context) , this[i], i, this))
return true;
return false
}
if (!Array.prototype.map ) {
// 배열을 반환합니다. 기존 배열의 각 요소는 제공된 함수의 반환 값을 호출합니다.
Array.prototype.map = function (func, context) {
var results = []
for (var i = 0; i < this.length; i ) {
if ( i in this)
results[i] = func.call(context, this[i], i, this)
}
결과 반환
}
exec 메소드는 true 및 false로 적절한 유형 변환을 통해 배열 또는 null 값을 반환하기 때문에 위 코드를 사용하면 다음과 같이 사용할 수 있습니다: ["a","b","ab", "ba "].filter(/^a/)는 "a"로 시작하는 모든 값을 반환합니다: ["a","ab"].
실제로 Array.prototype.filter는 Firefox에서 구현되었습니다. 왜냐하면 exec의 간접 호출이 이미 이 브라우저에서 작동하고 있기 때문입니다. 그러나 필터가 RegExp.prototype.call 메소드를 추가하지 않으면 브라우저 간에 실행할 수 없습니다.