JavaScript는 메소드 오버로딩이 없다.
매개변수의 갯수나, 속성, 리턴값의 일치여부를 체크하지 않는다.
함수를 선언하고 해당 함수가 호출되기 전 동일 네임의 함수가 다시 선언되는 경우 그대로 덮어쓴다.

하지만 메소드 오버로딩의 구현은 가능하다.
이를 구현한 소스가 있다.
자바스크립트의 전도사로, jQuery의 개발자로 유명한 John Resig의 소스이다.
원글 : http://ejohn.org/blog/javascript-method-overloading
아래와 같다.
01.// addMethod - By John Resig (MIT Licensed)
02.function addMethod(object, name, fn){
03.    var old = object[name];
04.    object[name] = function(){
05.        if (fn.length == arguments.length) 
06.            return fn.apply(this, arguments);
07.        else 
08.            if (typeof old == 'function'
09.                return old.apply(this, arguments);
10.    };
11.}
12.  
13.// Now setup the methods
14.function Users(){
15.    addMethod(this, "find", function(){
16.    // Find all users...
17.    });
18.    addMethod(this, "find", function(name){
19.        // Find a user by name
20.    });
21.    addMethod(this, "find", function(first, last){
22.        // Find a user by first and last name
23.    });
24.}
25.  
26.// Now use the methods
27.var users = new Users();
28.users.find(); // Finds all
29.users.find("John"); // Finds users by name
30.users.find("John", "Resig"); // Finds users by first and last name
31.users.find("John", "E", "Resig"); // Does nothing
짧고 간결하다.
하지만 짧은 코드안에 참 많은 함축적인 JavaScript의 문법들이 들어있다.
프로세스의 순서대로 나열해보자.

  1. 페이지가 호출되면 함수 선언부들이 라인별로 읽어들여진다.
  2. 27Line에서 new 전치 연산자로 Users함수가 생성자로 호출이 된다.
    1. Users 생성자는 this에 바인딩되며 생성자의 본문 내용을 메모리에 로드한다.
      1. addMethod를 만나고 addMethod의 본문이 치환되어 불려들여진다.
        1. 15Line에서 addMethod가 호출되며 인수로 3개가 넘어간다.
          1. old라는 변수에 users.find가 참조된다. (현재 users.find가 없으므로 undefined가 참조됨)
          2. users.find 메소드의 함수 선언 (실행이되는 부분이 아닌 선언부분임)
        2. 15Line에서 addMethod가 호출되며 인수로 3개가 넘어간다.
          1. old라는 변수에 users.find가 참조된다. (2-A-1-A에서 선언된 fn.length=0인 users.find가 참조됨)
          2. users.find 메소드의 함수 선언 (실행이되는 부분이 아닌 선언부분임)
        3. 21Line에서 addMethod가 호출되며 인수로 3개가 넘어간다.
          1. old라는 변수에 users.find가 참조된다. (2-A-1-B에서 선언된 fn.length=0인 users.find가 참조됨)
          2. users.find 메소드의 함수 선언 (실행이되는 부분이 아닌 선언부분임)
  3. 28Line에서 users.find() 메소드가 호출된다.
    1. Users객체에 담겨있는 addMethod의 치환 부분이 호출된다.
      1. 선언된 순서와 반대로 users.find 선언 부분이 호출된다. (fn.length=2인 user.find 선언 부분 호출)
        1. fn.length와 호출된 users.find 비교 결과 false (28Line의 호출된 users.find 메소드의 arguments=0 이므로 false)
        2. 8Line에서 이전 2-A-1-C-1에서 참조된 typeof old == 'function' true
        3. 참조되어 있던 2-A-1-B-2 메소드가 다시 users.addMethod에 선언부분으로 참조 변경됨. (2-A-1-C-2 -> 2-A-1-B-2로 참조 변경)
      2. 선언된 순서와 반대로 users.find 선언 부분이 호출된다. (fn.length=1인 user.find 선언 부분 호출)
        1. fn.length와 호출된 users.find 비교 결과 false (28Line의 호출된 users.find 메소드의 arguments=0 이므로 false)
        2. 8Line에서 이전 2-A-1-B-1에서 참조된 typeof old == 'function' true
        3. 참조되어 있던 2-A-1-A-2 메소드가 다시 users.addMethod에 선언부분으로 참조 변경됨. (2-A-1-B-2 -> 2-A-1-A-2로 참조 변경)
      3. 선언된 순서와 반대로 users.find 선언 부분이 호출된다. (fn.length=0인 user.find 선언 부분 호출)
        1. fn.length와 호출된 users.find 비교 결과 true (28Line의 호출된 users.find 메소드의 arguments=0 이므로 true)
        2. 6Line에서 이전 2-A-1-A-1에서 참조된 users.find 선언 부분이 실행된다. (16Line의 선언 부분 실행됨.)
  4. 29Line에서 users.find("John") 메소드가 호출된다.
    1. Users객체에 담겨있는 addMethod의 치환 부분이 호출된다.
      1. 선언된 순서와 반대로 users.find 선언 부분이 호출된다. (fn.length=1인 user.find 선언 부분 호출)
        1. fn.length와 호출된 users.find 비교 결과 false (28Line의 호출된 users.find 메소드의 arguments=1 이므로 false)
        2. 8Line에서 이전 2-A-1-C-1에서 참조된 typeof old == 'function' true
        3. 참조되어 있던 2-A-1-B-2 메소드가 다시 users.addMethod에 선언부분으로 참조 변경됨. (2-A-1-C-2 -> 2-A-1-B-2로 참조 변경)
      2. 선언된 순서와 반대로 users.find 선언 부분이 호출된다. (fn.length=1인 user.find 선언 부분 호출)
        1. fn.length와 호출된 users.find 비교 결과 true (28Line의 호출된 users.find 메소드의 arguments=1 이므로 true)
        2. 6Line에서 이전 2-A-1-B-1에서 참조된 users.find 선언 부분이 실행된다. (19Line의 선언 부분 실행됨.)
  5. 30Line에서 users.find("John") 메소드가 호출된다.
    1. Users객체에 담겨있는 addMethod의 치환 부분이 호출된다.
      1. 선언된 순서와 반대로 users.find 선언 부분이 호출된다. (fn.length=2인 user.find 선언 부분 호출)
        1. fn.length와 호출된 users.find 비교 결과 true (28Line의 호출된 users.find 메소드의 arguments=2 이므로 true)
        2. 6Line에서 이전 2-A-1-A-1에서 참조된 users.find 선언 부분이 실행된다. (22Line의 선언 부분 실행됨.)
  6. 31Line에서 users.find("John", "E", "Resig") 메소드가 호출된다.
    1. Users객체에 담겨있는 addMethod의 치환 부분이 호출된다.
      1. 선언된 순서와 반대로 users.find 선언 부분이 호출된다. (fn.length=2인 user.find 선언 부분 호출)
        1. fn.length와 호출된 users.find 비교 결과 false (28Line의 호출된 users.find 메소드의 arguments=3 이므로 false)
        2. 8Line에서 이전 2-A-1-C-1에서 참조된 typeof old == 'function' true
        3. 참조되어 있던 2-A-1-B-2 메소드가 다시 users.addMethod에 선언부분으로 참조 변경됨. (2-A-1-C-2 -> 2-A-1-B-2로 참조 변경)
      2. 선언된 순서와 반대로 users.find 선언 부분이 호출된다. (fn.length=1인 user.find 선언 부분 호출)
        1. fn.length와 호출된 users.find 비교 결과 false (28Line의 호출된 users.find 메소드의 arguments=3 이므로 false)
        2. 8Line에서 이전 2-A-1-B-1에서 참조된 typeof old == 'function' true
        3. 참조되어 있던 2-A-1-A-2 메소드가 다시 users.addMethod에 선언부분으로 참조 변경됨. (2-A-1-B-2 -> 2-A-1-A-2로 참조 변경)
      3. 선언된 순서와 반대로 users.find 선언 부분이 호출된다. (fn.length=0인 user.find 선언 부분 호출)
        1. fn.length와 호출된 users.find 비교 결과 false (28Line의 호출된 users.find 메소드의 arguments=3 이므로 false)
        2. 8Line에서 이전 2-A-1-A-1에서 참조된 typeof old == 'function' false
        3. 결국 아무것도 리턴되지 않고 종료

차근차근 실행된 순서들을 읽어나가다 보면 어찌하여 실행이 되었는지 알 수 있을 것이다.
사용된 JavaScript의 메소드는 다음과 같다.
1.function testFunction(value1, value2) {
2.    alert(testFunction.length); //호출 : 매개변수의 갯수 2
3.    alert(arguments.length);    //호출 : 인수의 갯수 3
4.}
5.testFunction("값1", "값2", "값3");

functionObj.length는 기능함수에서 정의된 인수의 갯수이고
functionObj.arguments.length는 기능함수가 호출될 때 전달받은 인수의 갯수이다.
나머지 사항은 이전에 언급한 적이 있던 함수의 호출 을 참조하여 흐름에 대해 파악하면 될 것이다.

주의해야 하는 점은 new 전치연산자로 생성자가 Users의 addMethod를 선언한 내용을 실제 메소드 호출을 할 때 선언을 한 순서의 역순으로 실행을 한다는 점이다.

Posted by Sting!

댓글을 달아 주세요


이전 버전 윈도우에서는 '폴더옵션 -> 파일형식' 에서 바로열리는 파일의 확장자를 선택하고

'고급' 버튼을 누르면 나오는 대화상자에서 '다운로드후 열기 전에 확인'란에 체크를 해주면 해결됐었지만

윈도우7에선 연결 프로그램만 설정 할 수 있을뿐... 해당 메뉴를 찾아볼수 없다...

결국은 레지스트리에서 편집하는 방법으로 해결했다.

1. 윈도우 + R을 눌러서 실행창을 띄운후 regedit를 쳐서 레지스트리 에디터를 실행한다.

2. HKEY_CURRENT_USER -> Software -> Microsoft -> Windows -> Shell -> AttachmentExecute ->
   {0002DF01-0000-0000-C000-000000000046} 로 이동해서 해당 확장자 키값을 삭제한다.

3. 파일을 다운받아본다.

왜 메뉴가 사라졌을까...
Posted by Sting!

댓글을 달아 주세요

참고:
Webparts
CSS Friendly Control Adapters

닷넷으로 개발을 하다보면 반드시 웹서버 콘트롤을 쓸 수 밖에 없는 경우가 생긴다. 그런데, 이 웹서버 콘트롤들이 웹표준을 따르지 않는 경우가 많다. 예를 들어서 불필요한 테이블 태그로 디자인을 한다거나 하는 경우 말이다. 또한 자주 쓰는 콘트롤 중에는 라디오박스 리스트, 체크박스리스트 등과 같은 리스트 콘트롤들이 있는데, 이걸 쓸데없이 테이블 태그로 감싸놓았다. 언제쯤 이런 콘트롤들이 CSS Friendly 하게 변하려나...

우얏든둥, MS에서는 이 사실을 인지하고 있는 듯 싶고, 공식적인 대응이라기 보다는 요 위의 코드플렉스 프로젝트인 CSS Friendly Control Adapters 를 이용해서 해결하려는 듯 싶다. 저걸 이용하면 많은 부분 해결을 할 수 있겠지만, 해당사항이 없는건 또 직접 만들어서 써야겠지.

아래 코드는 렌더링 상황에서 어떻게 테이블 태그를 없앨 수 있는지에 대한 내용이다. VB 코드로 짜놓은 거니 C#으로는 알아서 변형시키면 될 듯.

Public Class WebPartZoneControlAdapter
  Inherits System.Web.UI.WebControls.Adapters.WebControlAdapter

  Protected sw As StringWriter = Nothing
  Protected hw As HtmlTextWriter = Nothing

  Public Sub New()
    sw = New StringWriter
    hw = New HtmlTextWriter(sw)
  End Sub

  Protected Overrides Sub RenderBeginTag(ByVal writer As System.Web.UI.HtmlTextWriter)
    'MyBase.RenderBeginTag(writer)
  End Sub

  Protected Overrides Sub RenderEndTag(ByVal writer As System.Web.UI.HtmlTextWriter)
    'MyBase.RenderEndTag(writer)
  End Sub

  Protected Overrides Sub RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)
    MyBase.RenderContents(Me.hw)

    Dim org As String = Me.sw.ToString()
	' Removes table, tr and td tags while rendering
    Dim html As String = Regex.Replace(org, "<[/]?(table|tr|td|[ovwxp]:\w+)[^>]*?>", "", RegexOptions.IgnoreCase)
    writer.Write(html)
  End Sub
End Class

그다음에 App_Browsers 디렉토리를 만들고 그 안에 form.browser 파일을 만들어 아래 내용을 집어 넣으면 끝.

[browsers]
  [browser refID="Default"]
    [controlAdapters]
      [adapter controlType="System.Web.UI.WebControls.WebPartZone" adapterType="WebPartZoneControlAdapter" /]
    [/controlAdapters]
  [/browser]
[/browsers]

비슷한 방식으로 하면 다른 콘트롤들도 렌더링 할 때 불필요한 테이블 태그들을 없앨 수 있다.

참 쉽지? ^^


출처 : http://blog.daum.net/justinsays/6603080

Posted by Sting!

댓글을 달아 주세요

오픈API 사이트(Open API) 모음

네이트

네이버

다음

야후

Google 코드 사이트

me2day

트위터

스프링노트

동영상관련

 옥션

기타 오픈 API

 

참고자료

 


Posted by Sting!

댓글을 달아 주세요

ExtJS 관련 사이트 모음

ExtJS 2010. 10. 14. 11:45

ExtJS 공식사이트 : http://www.sencha.com/

영문 사이트




한글 사이트




Posted by Sting!

댓글을 달아 주세요