2012-03-25 2 views
1

이것은 간단한 질문 일뿐입니다. 어느 쪽이든 작동합니다.javascript : 메소드에 대한 개별 함수 또는 객체에 포함 된 함수?

예 .... 내가 처음으로 예를 선호하지만,이 방법은 우리가 개체에 "새로운"호출되기 때문에 더 많은 메모리가 두 번째 예보다 할당되도록 그 일을한다면 나는 몰랐다 1

var post = function(){ 
    var self = this; 
    self.div = $('<div></div>'); 
    self.color = function(color){ 
    this.div.css({background:color}); 
    } 
} 

var p = new post(); 
p.color("#FFF"); 

var post = function(){ 
    self = this; 
    self.div = $('<div></div>'); 
} 

var color = function(p, color){ 
    p.div.css({background:color}); 
} 

var p = new post(); 
color(p, "#FFF"); 

2 그래서 첫 번째 예에서, 내가 믿는 컬러 기능을 다시 얻을 것이다는 매번 새로운 포스트가 호출됩니다. 100 new post(); 전화가 있으면 어떻게됩니까? Is는 함수가 한 번만 정의되는 Example 2보다 비효율적입니까?

내가 묻는 것이 의미가 있습니까?

답변

7

예 1에서 예제 2에서는 "게시"개체의 모든 인스턴스에 대해 "색상"기능의 별도 인스턴스가 있지만 함수의 인스턴스는 하나만 존재합니다. 분명히, 많은 수의 "post"객체 인스턴스를 가지려면 필요한 것보다 많은 메모리를 사용하고 있어야합니다.

JavaScript에서는 두 가지 예제 중 가장 좋은 부분을 사용하여이 문제를 해결하는 일반적인 방법 (프로토 타입)은 규칙대로 대문자 "P"를 사용하는 "Post"를 사용합니다 new 연산자와 함께 사용하도록되어 생성자 함수)로 :

function Post() { 
    this.div = $('<div></div>'); 
} 

Post.prototype.color = function(color) { 
    this.div.css({background:color}); 
} 

var p = new Post(); 
p.color("#FFF"); 

는 (객체의 속성에 대해 우리의 실시 예에서 예를 들면 "p.color"을보고)의 특성은 직접 정의하지 않으면 예를 들어, 객체를 구성한 함수의 "prototype"(예 : "Post.prototype.color")의 속성으로 조회됩니다. 또한 프로토 타입에 인스턴스 메서드를 정의하고 원하는 경우 개별 인스턴스 속성 이름에 새 함수를 직접 할당하여 재정의 할 수 있음을 의미합니다.

이렇게하면 "p.color(...)"을 호출하는 멋진 객체 지향 구문과 모든 "Post"인스턴스에서 공유하는 하나의 함수 메소드 인스턴스의 이점을 얻을 수 있습니다.

+1

그건 정말 전형적입니다. 좋은 설명과 해결책, +1. – bernie

+0

이미 "게시"에 "프로토 타입"속성이 있습니까? 왜 우리는 Post.prototype = {}과 같은 것을 필요로하지 않는가? 우리가 사용하기 전에? (아무도 그렇게하지 않는다. 어떻게 작동하는지 궁금하다.) –

+1

@ 대니 Milosavljevic : http://es5.github.com/#x13.2, 단계 18. – pimvdb

관련 문제