2011-03-16 5 views
2

나는 웹 사이트를 개발하고 있습니다. 나는 자바 스크립트 코드를위한 좀 더 복잡한 프레임 워크를 만들 필요가 있다고 결론을 내렸다. 나는 자바 스크립트 라이브러리를 작성하는 방법의 다른 예제를 연구하기 시작했습니다. 방법을 적는 다소 혼란스러운 방법을 생각해 냈습니다. 나는 정말로 감사하는 사람에게 약간의 설명을 할 것이다. 그래서 여기js에서이 두 메서드 표현의 차이점은 무엇입니까

내가 일반적으로 방법을 아래에 다음과 같이 쓸 수있다 :

var ReportEnhancements = 
function() { 
    this.Name = function() 
    { 
     alert('It is me!'); 
    } 
} 

을 그리고 여기에 방법을 표현하는 또 다른 방법입니다 :

:

ReportEnhancements.prototype.Tooltip = { 
      setByTitle :function(elementsToTooltip) { 
       alert('I am about to be tooltiped!') 
     } 
} 

나 퍼즐 두 가지가 있습니다를

  1. 언제 prototype 키워드를 사용해야합니까? 언제 메소드를 멤버 이름으로 선언해야합니까?
  2. setByTitle과 Name을 살펴보십시오. 두 메서드가 모두 선언되어 있고 두 메서드가 모두 public 임에도 불구하고 서로 다릅니다.
  3. this.Name = function()과 setByTitle : function()의 차이점은 무엇입니까? 메소드를 선언하는 두 가지 구문이 다른 이유는 무엇입니까?

편집 :

나는 차이를 이해하는 데 더 가까워지고,하지만 난 아직 완전히 파악되지 않은 하나의 큰 문제가 있어요. 이러한 두 가지 방법으로 메소드를 표현하는 이유는 클래스가 두 가지 다른 액세스 규칙을 가지고 있기 때문입니다. javascript 객체 리터럴에서 private 메서드를 선언하는 것처럼 보이지 않습니다. 반면에, 정규의 중첩 된 요소를 가지고 있다면 public 수정 자로 공개 할 수 없습니다. 액세스 한정자는 무엇입니까?

감사합니다.

+1

[복제본에 '프로토 타입'과 'this'를 사용할 수 있습니까?] (http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) –

답변

2

하나의 중요한 차이점 (이것은 에 대답하지 않지만 이유는 중 하나임)은 범위입니다.

앞의 경우 this.Name()은 모두 하나의 클로저이기 때문에 외부 함수에서 선언 된 다른 변수에 액세스 할 수 있습니다. 그것은 "특권있는 방법"으로 알려져 있습니다.

원래 범위 외부에서 완전히 선언 된 후자의 버전은 해당 "개인"멤버 변수에 액세스 할 수 없습니다.

기술적으로 후자는 실제로는 메모리가 더 효율적입니다. 그 기능은 한 번만 생성되기 때문입니다. 첫 번째 버전에서 내부 함수는 해당 유형의 객체가 인스턴스화 될 때마다 재생성됩니다. 이러한 객체를 몇 개만 처리하면 문제가되지 않지만 수백 개를 만들려면 prototype 기반 메소드를 사용해야합니다.

편집 - 액세스 수식에 대해 편집에 관한 :

글쎄, 실제로 접근 수정 없다 전혀.

앞의 메서드는 "클로저"를 만들고 클로저는 로컬 전용 범위가있는 변수 선언을 포함 할 수 있습니다.그러나 함수도 객체이므로 this에 속성을 추가하면 해당 속성이 외부 세계에 노출됩니다. 하는 방법이나 변수 "수출"에 대한 일반적인 방법이하는 것입니다 : 반면에

var MyType = function() { 
    var method = function() { ... }; // this is private variable 

    this.method = method;    // this is a public property pointing 
};          // to the private variable 

을, 클로저를 작성하지 않는 객체 리터럴와 후자의 방법은, 그것은 명명 된 속성의 단지 스택의 에는 함수 참조가 포함됩니다.

개체의 모든 속성은 외부에서 액세스 할 수 있으므로 개체 리터럴을 사용하여 만든 모든 것은 암시 적으로 "공개"입니다.

+0

I 참조하십시오. 질문 1에 대한 답을 이해하는 데는 다소 도움이됩니다. 두 가지 방법에서 메서드 선언의 의미는 무엇인지 알 수 있습니까? 차이점은 왜 this.Name = function() 및 setByTitle : function()입니까? – vondip

+1

두 번째 것은 "개체 리터럴 구문"을 사용하므로 실제로 ToolTip.setByTitle을 생성합니다. – Alnitak

1

프로토 타입을 사용하면 표준 javascript 객체를 수정할 수 있습니다. 예를 들면 다음과 같습니다.

String.prototype.encode = function() {...};

또는

Function.prototype.declareMethod = 함수 (PARAM) { this.prototype [param.name = param.functionBody; 이것을 반환하십시오. };

함수가 프로토 타입 체인에 있기 때문에 delcareMethod를 사용할 수 있습니다.

관련 문제