2017-05-24 4 views
1

나는 생성자의 프로토 타입 기능을 가지고있다. 그리고 저의 질문이 가리키는 곳입니다. 다음과 같이자바 스크립트 가장 좋은 방법은 프로토 타입

function Animal(name) { 
    this.name = name 
} 

Animal.prototype.generateToys = function(numberOfToys) { 
    if(numberOfToys == 1) { 
    this.createToys(); 
    } 
    else { 
    this.createToys(); 
    } 

    function createToys() { 
    ... 
    ... 
    ... 
    } 
} 

을 또는 당신은 방법 (프로토 타입)로 만들 것입니다 : 그렇게 같은 방법 generateToys 내부 createToys을 만들기 위해 더 나은, generateToyscreateToys()를 호출 할 수있는 유일한 방법이 될 것입니다 것입니다 가정

Animal.prototype.createToys = function() { 
    ... 
    ... 
    ... 
} 

왜 더 낫겠습니까? :)

+1

에 달려 있습니다. 객체의 모든 인스턴스에서 createToys에 직접 액세스 할 수있게 하시겠습니까? 또는 generateToys를 통과하도록 하시겠습니까? 당신은 내부 generateToys를 가지고 있기 때문에, 나는 당신이 항상 generateToys를 통과하기를 원한다고 생각하고있다. 그래서 함수는 private이어야한다. – yBrodsky

+3

가장 좋은 해결책은 작동하는 것이다. 첫 번째 제안은'createToys'를 인스턴스에 대한 속성으로 만들지 않으므로'this.createToys() '호출은 실패합니다 (즉, 작동하지 않습니다). 그러나 그것을 고치더라도 왜'generateToys'가 호출 될 때마다'createToys'를 다시 만들어야합니까? 그건 불필요한 것처럼 보입니다 (적어도 당신의 모범을 보시면). 함수를 한 번 정의하십시오. 당신이 그것을하는 곳에 ('prototype', "클래스"밖의 함수) 정말로 중요하지 않습니다. –

+1

Douglas Crockford, Function The Ultimate (https://www.youtube.com/watch?v=ya4UHuXNygM)의 강연을 보도록 조언 드리지만, 객체 생성 작업을위한 다양한 방법을 제공합니까? – Booster2ooo

답변

1

generateToys() 메서드 안에 넣으면 해당 메서드를 호출 할 때마다 다시 선언 된 다음 메서드가 완료 될 때 범위에서 제거됩니다. 대부분이 시간은 원하는 시간이 아니므로 별도의 방법으로 생성하는 것이 좋습니다.

1

아키텍처에 따라 다릅니다.

Animal의 인스턴스를 여러 개 만들 계획 인 경우 프로토 타입에 메서드를 추가하는 것이 좋습니다. 그렇지 않으면 많은 비공개 함수가 만들어지며 성능 측면에서 비용이 많이 듭니다. 프로토 타입 내부의 함수를 선언

1

그 범위 외부 가시성을 제한하고 기능을 사용하면 프로토 타입에 선언 Animal.prototype.generateToys() (메모리의 낭비)

Animal.prototype.generateToys = function(numberOfToys) { 
    var createToys = function createToys() { 

    } 

}) 

호출 할 때마다 선언되도록 즉, 인스턴스의 각 직접 호출 할 수 있으며 프로토 타입 자체는 모든 인스턴스가 공유하는 단일 참조이기 때문에 해당 선언을 사용하여 메모리에 단 하나의 지점 만 남게됩니다.