2012-08-03 2 views
3

나는 몇 번이자바 스크립트 코딩 차이

function class1(){ 
..... 
    class1.prototype.callme = function(){ 
     alert("hai"); 
    } 
} 
then I instantiate using (new class1()).callme(); 

같은 클래스를 생성하고 장점과 단점은 어떤 몸이 설명해 수 뭐죠 몇 번 나는 모듈 형 패턴

var class2 = (function(){ 
var privatemethod = function(){ 
.... 
} 
var publicmethod = function(){ 
alert("am public"); 
} 
return{ 
callme:publicmethod 
} 
})(); 

then I call class2.callme() 

를 사용합니다.

+0

왜 'prototype' _inside_ 생성자 함수에 속성 ​​/ 메소드를 만드시겠습니까? 첫 번째 예제에서'class1.prototype.callme'은 새로운 class1 인스턴스를 생성 할 때마다 덮어 쓰여지는데, 이는 비효율적입니다. 그리고 실제로'(new class1()). callme() '을 사용한다면 (즉,이 질문에 대한 단순화는 아닙니다) 전체 클래스는 다소 중복됩니다. – nnnnnn

+0

그 예를 들어 보겠습니다.하지만 장점과 단점을 원합니다. –

+1

첫 번째 패턴은 결코 좋은 계획이 아닙니다. 그것은 반 패턴입니다. 프로토 타입에서 메소드를 호출하기 위해 객체를 인스턴스화한다고해도 많은 도움이되지 않으며 두 번째 패턴이 항상 더 좋을 것입니다. 실제로 class1의 개별 인스턴스로 무언가를 실제로하면 두 번째 예제와 다른 목적을 수행하지만보다 현실적인 예제를 제공하지 않으면 두 인스턴스를 비교하는 것이 어렵습니다. – nnnnnn

답변

2

첫 번째 것은 생성자이고 두 번째는 개체이므로 두 번째 생성자는 동일하지 않습니다. 다른 상황에서 하나 또는 다른 것을 사용하고자 할 수 있습니다. 어쨌든 일반적으로 프로토 타입을 생성자 외부에 선언하고 공용 메서드 및 변수에 this.property을 사용합니다. 두 번째 옵션은 jQuery의 extend 또는 Underscore의 _extend과 같은 것을 사용하지 않는 한 클래스로 재사용 할 수 없습니다. 일반적으로이 방법은 프로토 타입 체인 확장 코드가 없으면 더 간단합니다.

+0

사실 나는 화재 버그를 사용할 때 약간의 시간도, 첫 번째 방법은 코드를 공개하지 않지만 두 번째 것은, 또한 그뿐만 아니라 셀 것입니다 동의합니다? 내가 틀렸다면 나를 바로 잡으십시오. –

+0

연장에 대한 예를 들어 줄 수 있습니까? 새 클래스 (class3이라고 함)에서 동일한 메서드를 만들고 확장 할 때 class2의 메서드가 class3의 메서드를 재정의합니다. 미안 당신을 혼란스럽게한다면 : –

1

:

자유는 우리의 모듈에 의해 소비 될 수있는 개인 기능을 가지고. 페이지의 나머지 부분에 노출되지 않으므로 (내 보낸 API 만 있음) 진정한 사적인 것으로 간주됩니다.

함수가 정상적으로 선언되고 이름이 지정되면 예외를 던진 함수를 발견하려고 할 때 디버거에서 호출 스택을 표시하는 것이 쉬울 수 있습니다.

T.J Crowder는 과거에 지적했듯이 환경에 따라 다른 기능을 반환 할 수도 있습니다. 과거에는 개발자가이 도구를 사용하여 Internet Explorer 전용 모듈에 코드 경로를 제공하기 위해 UA 테스트를 수행했지만 비슷한 목표를 달성하기 위해 요즘에는 기능 검색을 쉽게 선택할 수 있습니다.

+1

그것은 일반적으로 좋은 블로그 게시물이지만 실제로이 질문과 전혀 관련이 없습니다. – nnnnnn

+0

업데이트 됨 : 감사합니다. –

관련 문제