>  기사  >  웹 프론트엔드  >  JavaScript가 함수 오버로딩을 쉽게 지원하도록 하기(1부 - 디자인)_javascript 기술

JavaScript가 함수 오버로딩을 쉽게 지원하도록 하기(1부 - 디자인)_javascript 기술

WBOY
WBOY원래의
2016-05-16 18:48:38935검색
JavaScript는 오버로딩을 지원하나요?
JavaScript는 함수 오버로딩을 지원하나요? 지지하지 않는다고 말할 수도 있고, 지지한다고 말할 수도 있습니다. 함수 오버로딩을 기본적으로 지원하는 다른 언어들처럼 자바스크립트는 동일한 이름을 가진 여러 함수를 직접 작성할 수 없고, 특정 호출에 해당하는 오버로드가 무엇인지 컴파일러가 판단하게 하기 때문에 지원되지 않는다고 합니다. JavaScript 함수는 매개변수 목록에 어떠한 제한도 두지 않고 함수 오버로딩에 대한 지원을 함수 내에서 시뮬레이션할 수 있기 때문에 지원된다고 합니다.
실제로 잘 알려진 많은 오픈 소스 라이브러리에서는 함수 내에서 내부 시뮬레이션 오버로드를 지원하는 설계를 볼 수 있습니다. 예를 들어 jQuery의 jQuery.extend 메소드는 매개변수 유형을 통해 선택적 매개변수가 존재하는지 여부를 판별합니다. 존재하지 않는 경우 후속 로직이 올바르게 실행되도록 매개변수가 이동됩니다. 나는 많은 사람들이 JavaScript를 작성할 때 기능이 풍부한 기능에 대한 간단한 호출 항목(또는 다중)을 제공하기 위해 비슷한 코드를 작성했다고 생각합니다.
그러나 파종방식에는 근본적인 문제가 있는데, 바로 DRY 원칙에 위배된다는 점이다. 오버로드를 지원하는 각 함수에는 매개변수 수와 매개변수 유형을 기반으로 오버로드를 처리하는 데 사용되는 추가 코드 조각이 있습니다. 이러한 코드는 반복되는 논리를 의미하지만 작성 시 각 코드 조각은 다릅니다. 게다가 이러한 코드는 코드를 읽을 때 함수가 지원하는 여러 오버로딩 방법이 무엇인지 한눈에 알 수 없고, 당연히 오버로딩을 유지하기 어렵기 때문에 유지 관리가 쉽지 않습니다.
오버로드된 포털을 설명하는 DSL
오버로드된 포털을 JavaScript로 간단한 방법으로 설명할 수 있었으면 좋겠습니다. 다른 언어에서처럼 오버로드 항목을 구별하려면 함수 서명을 사용하는 것이 가장 좋습니다. 왜냐하면 함수 서명이 이를 위한 최고의 DSL이라고 생각하기 때문입니다. 내가 생각하는 오버로드된 항목 설명 DSL은 JavaScript 구문과 가장 일치해야 합니다.
코드 복사 코드는 다음과 같습니다. :

var sum = new Overload();
sum.add("Number, Number",
function(x, y) { return x y; }); sum.add ("Number, Number, Number",
function(x, y, z) { return x y z; })

오버로드된 항목과 해당 함수 본문을 설명한 후 sum 함수 호출은 다음과 같아야 합니다.
sum(1, 2);
sum(1, 2, 3)
위 코드는 매우 명확하고 유지 관리하기 쉬운 것 같습니다. 리로드 항목의 시그니처를 한눈에 확인할 수 있으며, 리로드 항목의 수정이나 추가가 매우 쉽습니다. 그러나 문제가 발생했습니다. 즉, JavaScript의 함수는 새 함수일 수 없으며 new Overload()를 통해 얻은 객체를 호출하면 안 됩니다. 이러한 이유로 Overload를 정적 클래스로만 만들 수 있으며 정적 메서드는 Function 인스턴스를 반환합니다.

코드 복사 코드는 다음과 같습니다.
var sum = Overload
.add ("숫자, 숫자",
function(x, y) { return x y; })
.add("숫자, 숫자, 숫자",
function(x, y, z) { return x y z ; });

오버로드된 항목 지원이 필요합니다
위 DSL로 설명할 수 없는 일반적인 JavaScript 함수 항목이 무엇인지 상상해 보십시오. 내가 아는 두 가지 유형이 있습니다:
임의 유형 매개변수
각 함수를 작성한다고 가정해 보겠습니다. Array의 경우 해당 첨자를 반복하고 다른 유형의 경우 이러한 항목의 모든 항목을 반복합니다. 두 가지 기능은 다음과 같습니다. 매개변수 목록을 선언하는 방법은 무엇입니까? C#을 사용하는 경우 두 가지 함수 입구를 다음과 같이 설명합니다.
void Each(IEnumerable iterator) { }
void Each(object iterator) { }
그러나 JavaScript에서는 Object가 기본 클래스가 아닙니다. of all type , (100) object의 인스턴스 결과는 false이므로 Object를 사용하여 어떤 유형도 참조할 수 없으며 모든 유형을 참조하려면 새 기호를 도입해야 합니다. 이 기호는 가능한 클래스 이름과 충돌해서는 안 된다는 점을 고려하여 모든 유형을 나타내기 위해 "*"를 사용하기로 결정했습니다. 위의 C# 코드에 해당하는 JavaScript는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
var Each = 오버로드
.add("Array",
function(array) { })
.add("*",
function(object) { });


매개변수 수 제한 JavaScript 함수에서는 매개변수 수에 관계없이 지원하는 것이 매우 일반적인 요구 사항이며 params 키워드보다 훨씬 더 많이 사용된다고 생각합니다. C#에서. 이는 이전에 공식화한 규칙으로는 설명할 수 없으므로 C#에서 매개변수를 나타내려면 클래스 이름과 충돌하지 않는 기호를 도입해야 합니다. 매개변수를 표시하기 위해 "..."를 사용하기로 선택했습니다. 이는 여기에 있는 매개변수의 수에 관계없이 허용된다는 의미입니다. jQuery.extend의 ​​오버로드를 어떻게 설명해야 하는지 살펴보겠습니다.

코드 복사 코드는 다음과 같습니다.

var 확장 = 오버로드
.add("*, ...",
function(target) { })
.add("Boolean, *, ...",
function(deep, target) { });

요약
이 글에서는 JavaScript에 적합하고 쉽게 사용할 수 있는 메소드를 설계해 보겠습니다. 유지 관리가 쉬운 함수 오버로딩을 읽어보세요. 다음 기사에서는 이 디자인을 구현하기 위해 Overload 클래스를 작성해 보겠습니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.