복붙노트

[JQUERY] 방법은 자바 스크립트에 과부하

JQUERY

방법은 자바 스크립트에 과부하

해결법


  1. 1.자바 스크립트는 방법 (Java 또는 비슷한 같이) 과부하, 세 번째 기능은 이전의 선언을 덮어 쓰기를 지원하지 않습니다.

    자바 스크립트는 방법 (Java 또는 비슷한 같이) 과부하, 세 번째 기능은 이전의 선언을 덮어 쓰기를 지원하지 않습니다.

    대신, 인수 객체를 통해 변수 인수를 지원합니다. 당신은 할 수

    function somefunction(a, b) {
        if (arguments.length == 0) { // a, b are undefined
            // 1st body
        } else if (arguments.length == 1) { // b is undefined
            // 2nd body
        } else if (arguments.length == 2) { // both have values
            // 3rd body
        } // else throw new SyntaxError?
    }
    

    또한 바로 확인 할 수 대해서 typeof == 등이 호출 된 SomeFuncion을 (미정)에서 arguments.length은 1이고, 이것은 다양한 매개 변수, 예를 들어,와 easer 호출을 허용 할 수 있도록 것 "미등록" 당신은 아마도 비어 변수가있을 때.


  2. 2.JS가 제공되지 않은 파라미터로 정의 전달한다. 당신이 오버로드 같은 것을 원하는 경우 아래 코드에 비슷한 일을 수행해야합니다 :

    JS가 제공되지 않은 파라미터로 정의 전달한다. 당신이 오버로드 같은 것을 원하는 경우 아래 코드에 비슷한 일을 수행해야합니다 :

    function someFunction(a, b) {
        if (typeof a === 'undefined') {
            // Do the 0-parameter logic
        } else if (typeof b === 'undefined') {
            // Do the 1-parameter logic
        } else {
            // Do the 2-parameter logic
        }
    }
    

  3. 3.당신은 각각의 새로운 선언 변수 된 SomeFuncion을 삭제하고 있습니다.

    당신은 각각의 새로운 선언 변수 된 SomeFuncion을 삭제하고 있습니다.

    이것은 동일합니다

       window.somefunction = function(...
       window.somefunction = function(...
       window.somefunction = function(...
    

    자바 스크립트 메소드 오버로딩을 제공하지 않습니다.

    적절한 방법 중 하나입니다 :


  4. 4.당신은 자바 스크립트의 메소드를 오버로드 할 수 없습니다. 자바 스크립트 함수는 변수에 저장된다. 전역 변수는 window 객체에 저장됩니다. 당신은 같은 이름 (전용 키 해시)와 객체 당 하나 개의 속성을 가질 수 있습니다.

    당신은 자바 스크립트의 메소드를 오버로드 할 수 없습니다. 자바 스크립트 함수는 변수에 저장된다. 전역 변수는 window 객체에 저장됩니다. 당신은 같은 이름 (전용 키 해시)와 객체 당 하나 개의 속성을 가질 수 있습니다.

    당신이 할 수있는 것은, 대부분의 매개 변수를 사용하여 정의를 정의하고 전달 얼마나 많은 확인할 수 있습니다.

    function Test(a, b, c)
    {
        if(typeof a == 'undefined') 
        {
            a = 1;
        }
    
        if(typeof b == 'undefined') 
        {
            b = "hi";
        }
    
        if(typeof c == 'undefined') 
        {
            c = Date.Now;
        }
    }
    

    내가 테스트 ()를 호출하면 내가 Test라는 것처럼 지금, 그것은 행동 것 (1, "안녕하세요", Date.Now)


  5. 5.이 모든 유형의 매개 변수의 수를 통과 할 수 있기 때문에 자바 스크립트에 과부하 실제 기능은 없습니다. 가장 좋은 방법은 기능을하는 것입니다 처럼: 이 myfunc (옵트)

    이 모든 유형의 매개 변수의 수를 통과 할 수 있기 때문에 자바 스크립트에 과부하 실제 기능은 없습니다. 가장 좋은 방법은 기능을하는 것입니다 처럼: 이 myfunc (옵트)

    {
    // with opt = {'arg1':'a1','arg2':2, etc}, then check your opt inside of the function
    }
    

  6. 6.나는 여기에 설명이 문제에 대한 우아한 해결책을 개발하기 위해 노력했다. 그리고 당신은 여기에서 데모를 찾을 수 있습니다. 사용법은 다음과 같습니다 :

    나는 여기에 설명이 문제에 대한 우아한 해결책을 개발하기 위해 노력했다. 그리고 당신은 여기에서 데모를 찾을 수 있습니다. 사용법은 다음과 같습니다 :

    var out = def({
        'int': function(a) {
            alert('Here is int '+a);
        },
    
        'float': function(a) {
            alert('Here is float '+a);
        },
    
        'string': function(a) {
            alert('Here is string '+a);
        },
    
        'int,string': function(a, b) {
            alert('Here is an int '+a+' and a string '+b);
        },
        'default': function(obj) {
            alert('Here is some other value '+ obj);
        }
    
    });
    
    out('ten');
    out(1);
    out(2, 'robot');
    out(2.5);
    out(true);
    

    이를 달성하기 위해 사용되는 방법 :

    var def = function(functions, parent) {
     return function() {
        var types = [];
        var args = [];
        eachArg(arguments, function(i, elem) {
            args.push(elem);
            types.push(whatis(elem));
        });
        if(functions.hasOwnProperty(types.join())) {
            return functions[types.join()].apply(parent, args);
        } else {
            if (typeof functions === 'function')
                return functions.apply(parent, args);
            if (functions.hasOwnProperty('default'))
                return functions['default'].apply(parent, args);        
        }
      };
    };
    
    var eachArg = function(args, fn) {
     var i = 0;
     while (args.hasOwnProperty(i)) {
        if(fn !== undefined)
            fn(i, args[i]);
        i++;
     }
     return i-1;
    };
    
    var whatis = function(val) {
    
     if(val === undefined)
        return 'undefined';
     if(val === null)
        return 'null';
    
     var type = typeof val;
    
     if(type === 'object') {
        if(val.hasOwnProperty('length') && val.hasOwnProperty('push'))
            return 'array';
        if(val.hasOwnProperty('getDate') && val.hasOwnProperty('toLocaleTimeString'))
            return 'date';
        if(val.hasOwnProperty('toExponential'))
            type = 'number';
        if(val.hasOwnProperty('substring') && val.hasOwnProperty('length'))
            return 'string';
     }
    
     if(type === 'number') {
        if(val.toString().indexOf('.') > 0)
            return 'float';
        else
            return 'int';
     }
    
     return type;
    };
    

  7. 7.이는 예상 된 동작입니다.

    이는 예상 된 동작입니다.

    문제는 자바 스크립트가 기본적으로 메소드 오버로딩을 지원하지 않는다는 것입니다. 그것을보고한다면, / 동일한 이름을 가진 두 개 이상의 기능 그냥 마지막 정의 함수를 고려하고 이전의 것들을 덮어 쓸 수 있습니다 구문 분석합니다.

    나는이 사건의 대부분은 다음입니다 적합하다고 생각하는 방식의 하나 -

    당신이 방법을 말할 수 있습니다

    function foo(x)
    {
    } 
    

    대신 자바 스크립트 수없는 방법을 오버로드의 새 방법을 정의 할 수 있습니다

    fooNew(x,y,z)
    {
    }
    

    다음과 같이 다음 1 기능을 수정 -

    function foo(x)
    {
      if(arguments.length==2)
      {
         return fooNew(arguments[0],  arguments[1]);
      }
    } 
    

    당신이 많은 그런 오버로드 방법이있는 경우와 똑같이-else 문보다 스위치를 사용하는 것이 좋습니다.

    같은 표준 또는 자바 스크립트 메소드 오버로딩을 할 수있는 더 검증 된 방법은 없습니다. 하나는 무엇에 가장 적합한 자신의 프로그래밍 설계를해야한다. 나는 충분해야 정의되지 있지 않은지 유형을 확인하여 인수 길이에 대한 간단한 스위치를 말할 것입니다.


  8. 8.인수는 개념으로 오버로드하는 방법을 만드는 데 사용되는 객체.

    인수는 개념으로 오버로드하는 방법을 만드는 데 사용되는 객체.

    인수는 함수 실행 컨텍스트 내에서만 사용할 수 개체의 특별한 유형입니다.

    에서 arguments.length 속성은 함수에 전달 된 매개 변수의 수를 식별하는 데 사용됩니다.

    당신은 가짜 메소드 오버로딩을 만들 수있는 최고 수준의 기능의보다 효율적으로 사용하실 수 있습니다. 전체 개념은 내 자신의 웹 사이트에 설명 : 과부하 기능을 자바 스크립트에서


  9. 9.메소드 오버로딩 직접 자바 스크립트에서 지원되지 않습니다. 여기에 아래와 같이 당신이 좋아 매우 무언가를 달성 할 수있는 방법을 예입니다 :

    메소드 오버로딩 직접 자바 스크립트에서 지원되지 않습니다. 여기에 아래와 같이 당신이 좋아 매우 무언가를 달성 할 수있는 방법을 예입니다 :

    function overloadMethod(object, name, fn){
    
                if(!object._overload){
                object._overload = {};
                }
    
                if(!object._overload[name]){
                object._overload[name] = {};
                }
    
                if(!object._overload[name][fn.length]){
                object._overload[name][fn.length] = fn;
                }
    
                  object[name] = function() {
                            if(this._overload[name][arguments.length])
                            return this._overload[name][arguments.length].apply(this, arguments);
                  };
    }
    
    function Students(){
      overloadMethod(this, "find", function(){
                // Find a student by name
      });
    
      overloadMethod(this, "find", function(first, last){
                // Find a student by first and last name
      });
    
    }
    
    var students = new Students();
    students.find(); // Finds all
    students.find("Rahul"); // Finds students by name
    students.find("Rahul", "Mhatre"); // Finds users by first and last name
    

    소스 : 소스


  10. 10.당신이 클래스를 사용하는 경우는 다른 매개 변수를 같은 방법으로이 두 개의 서로 다른 클래스를 만들 수 있습니다. 그럼 당신은 모방 오버로딩 행동 의존성 주입과 함께 확산 연산자를 사용할 수 있습니다.

    당신이 클래스를 사용하는 경우는 다른 매개 변수를 같은 방법으로이 두 개의 서로 다른 클래스를 만들 수 있습니다. 그럼 당신은 모방 오버로딩 행동 의존성 주입과 함께 확산 연산자를 사용할 수 있습니다.

    클래스 푸 { 방법(){ 을 console.log ( '방식 foo는에서 안녕하세요') } } 클래스 바 { 방법 (명) { CONSOLE.LOG이 (`방법 바에서 안녕하세요. 이름은 $입니다 {이름}`) } } 함수 MimicOverload OBJ (옵션) { obj.method (... 옵션) } CONST OBJ1 = 새로운 푸 () const를 obj2보다 = 새로운 바 () MimicOverload (OBJ1 []) MimicOverload (obj2보다 [ '오버로드'])

  11. from https://stackoverflow.com/questions/12694588/method-overloading-in-javascript by cc-by-sa and MIT license