2012-02-08 4 views
1

Java/C++ OOP 배경에서 왔으며 JavaScript "객체 지향"프로그래밍을 시도하고 있습니다. 나는 작은 프레임 워크를위한 소스를보고 있었고 내가 이상하게 발견 한 것을 발견했다. 프레임 워크는 일부 전역 함수를 정의한 다음 객체 함수 내에서 해당 함수를 호출합니다. 명확히하기 위해 다음 예를 참조하십시오.왜 JavaScript 프로토 타입 함수에서 전역 함수를 사용합니까?

var MyObject = function() { 

    function MyObject() { 
     this.x = 5; 
    } 

    MyObject.prototype.getX = function() { 
     return _MyObjectGetX(this); 
    }; 

    return MyObject; 
}(); 

var _MyObjectGetX = function(myObject) { 
    return myObject.x; 
}; 

전역 함수의 사용법은 잘 모르겠습니다. 전역 함수가 한 곳에서만 사용된다고 가정 해 봅시다 : MyObject.getX(). 왜 함수 몸체로 리턴을 이동하지 않는 것이 좋을까요? 괜찮습니까?

var MyObject = function() { 

    function MyObject() { 
     this.x = 5; 
    } 

    MyObject.prototype.getX = function() { 
     return this.x; 
    }; 

    return MyObject; 
}(); 

이 프레임 워크는 CoffeeScript로 작성되었으며 JavaScript로 변환되었습니다. 커피 스크립트가 불필요 할 수있는 것입니까, 아니면 JavaScript가 함수와 개체를 처리하는 방식을 완전히 오해하고 있습니까 (아니면 개체로 사용합니까?)?

+0

실제로 예제를 게시하는 것이 더 나을 것입니다. 실제 예제에는 적용되지만 작성한 예제에는 적용되지 않는 이유가있을 수 있습니다. (그럴 지 모르겠지만, 가능할 것 같습니다.) – ruakh

+0

@ruakh Brandan이 맞다면 실제 예제와 다른 점은 일부 전역 함수가 여러 객체에서 호출된다는 것입니다. 그러나 때로는 그렇지 않습니다. – WillP

+0

프레임 워크에 대한 CoffeeScript 소스 코드가 있습니까? 그것은 추측을 좁히는 데 도움이 될 수 있습니다. – ruakh

답변

2

편집 : 죄송합니다. 질문을 잘못 읽었습니다.

이 경우 coffeescript가 그냥 바보처럼 보이는 것 같습니다 ... wysiwyg가 html로 생성 한 것과 비슷합니다.

var MyObject = function() {  
    function MyObject() { 
     this.x = 5; 
    } 

    MyObject.prototype.getX = function() { 
     return _MyObjectGetX(this); // referencing a closure 
    }; 

    return MyObject; 
}(); 

var _MyObjectGetX = function(myObject) { 
    return myObject.x; 
}; 

정말

 var MyObject = function() { 
      this.x = 5; 
     }; 

     MyObject.prototype.getX = function() { 
      return this.x; 
     }; 

간단하고 상단 커피 스크립트 예제에서 사용 된 외부 getter 함수는 간단한 반환 아무런 이득이없는 것으로 보인다 아무런 이점이 없습니다. 실제로 캡슐화가 제공되지 않으므로 실제로 getter에 대한 합법적 인 사용이없는 것 같습니다. x 속성은 객체가 전달 된 위치에 관계없이 객체에서 쉽게 사용할 수 있으며 수정할 수 있습니다.

프레임 워크가 이것을 선택하는 몇 가지 이유가 있습니다. 그러나이 간단한 예제에서는 이해가되지 않습니다.

+0

MyObject는 전역 함수는 아니지만 나는 정말로 "MyObject"에 대해 말하지 않고 있었다. 나는 MyObject.prototype.getX()에 대해 (this에서 항상 호출 한) 전역 함수 인 _MyObjectGetX()를 호출하는 대신 this.x를 반환하기보다는 요청했다. – WillP

+0

죄송합니다. 게시물을 잘못 읽었습니다. 그에 따라 내 대답이 업데이트되었습니다. – Gopherkhan

+0

감사합니다. CoffeeScript가 필요하지 않을 때 CoffeeScript가 최적화 (또는 추상화)하고있는 것으로 보입니다. 브렌든이 먼저 대답 한 이래로 내가 그에게 줄거야. 너무나 나쁘면 한 가지 이상의 답을 확인할 수 없습니다. 편집 : 죄송합니다. 전체 게시물 편집을 보지 못했습니다. 더 긴 설명에 감사드립니다. – WillP

2

이것은 컴파일러 최적화와 같아서 아마도 CoffeeScript 번역의 결과 일 것입니다.

이 함수를 다른 컨텍스트에서 재사용하려고 시도했을 수 있습니다. 어떤 객체를 _MyObjectGetX으로 전달할 수 있으며 객체의 x 속성을 반환합니다. 따라서 동일한 기능을 수행하는 두 가지 방법을 감지하면 그 중 하나를 최적화하여 응용 프로그램의 메모리 사용 공간을 줄일 수 있습니다.

+0

아, 아마도 CoffeeScript는 함수가 여러 객체에서 재사용 될 수 있다고 가정합니다. 그것이 내가 생각할 수있는 일입니다. 함수 *가 재사용되지 않는다고 가정하면, MyObject의 메서드 내부로 반환하는 것이 안전할까요? – WillP

+0

하지만 메서드를 최적화하지 않고 메서드를 만드는 중이지만이 메서드는 이제 외부 함수에 대한 래퍼입니다. ('MyObject.prototype.getX'는 여전히 단지'_MyObjectGetX'와는 별개의 기능입니다.) – ruakh

+0

@WillP 그게 내가 생각한거야.하지만 CoffeeScript가 어떻게 작동하는지 정말로 모르겠다. 아주 드물게 사용되는 최적화 인 것처럼 보입니다. – Brandan