2012-03-19 3 views
6

VAR와 자바 스크립트 클래스 내에서 내부 변수를 선언의 차이점은 무엇입니까?JavaScript 클래스에서 변수 선언 : this와 var. 차?

예 : 우리가 Foo.tool가 정의되지 않은 얻을 것입니다 반면 Foo2.tool는 "망치"를 얻을 것입니다 알고 있습니다

function Foo() { 
    var tool = 'hammer'; 
} 

function Foo2() { 
    this.tool = 'hammer'; 
} 

한 가지 차이점.

이 다른 차이가 있습니까? 1 대 다른 사람을위한 권고?

감사합니다.

+0

음, 분명히 다른 용도로 사용됩니다. 'this.tool'을 사용할 이유가 없으면'var tool '을 사용하십시오. – Blender

+0

고마워, 믹서기! 그들이 제공하는 다양한 목적에 대해 자세히 설명해 주시겠습니까? – Crashalot

+0

클래스 외부에서'var tool '을 사용할 수 없으므로 클래스 외부에서 사용하지 못하게됩니다. 'this.tool'은 수업 외부에서 호출되도록 만들어졌습니다. – Blender

답변

14

에는 "하나 또는 다른"두 가지의 목적이 다르기 때문에 여기에 존재하지 않는다.

이 고려 : OOP에서

var Melee = function(){ 

    //private property 
    var tool = 'hammer'; 

    //private method 
    var attack = function(){ 
     alert('attack!'); 
    }; 

    //public property 
    this.weapon = 'sword'; 

    //public methods 
    this.getTool = function(){ 
     return tool; //can get private property tool 
    }; 
    this.setTool = function(name){ 
     tool = name; //can set private property tool 
    }; 
}; 

var handitem = new Melee(); 
var decoration = new Melee(); 

//public 
handitem.weapon;     //sword 
handitem.getTool();    //hammer 
handitem.setTool('screwdriver'); //set tool to screwdriver 
handitem.getTool();    //is now screwdriver 

//private. will yield undefined 
handitem.tool; 
handitem.attack(); 

//decoration is totally different from handitem 
decoration.getTool();   //hammer 
  • handitem.weapon 외부에서 액세스 할 수있는 "공유 재산"이다. Melee의이 인스턴스를 만든 경우 일반인에게 공개되어 있으므로 weapon에 액세스하여 수정할 수 있습니다.

  • handitem.tool는 "개인 재산"입니다. 객체 내부에서만 액세스 할 수 있습니다. 그것은 보이지도 않고, 접근 가능하지도 않고, 외부로부터 (최소한 직접적으로) 수정할 수 없다. 액세스하려고하면 undefined

  • handitem.getTool이 "공개 방법"입니다. 객체 안쪽에 있으므로 개인 속성 tool에 액세스 할 수 있으며 외부에서 가져올 수 있습니다. 사적인 세계에 대한 일종의 다리.

  • handitem.attack 전용 메소드이다. 모든 개인 물건처럼 내부에서만 액세스 할 수 있습니다. 이 예에서는 attack()을 호출 할 수있는 방법이 없습니다. (공격으로부터 안전합니다 : D)

+0

고마워, 조셉. 명확히하기 위해, Melee의 다른 인스턴스를 만들면 각자가 "도구"의 자체 복사본을 갖게됩니까? 아니면 하나를 업데이트하면 다른 사람들을 위해 "도구"를 덮어 씁니까? – Crashalot

+0

아니요, 'new Melee()'를 호출 할 때마다 다른 객체가 만들어집니다. 하나의 속성을 업데이트해도 다른 하나의 값은 변경되지 않습니다. – Joseph

+1

'new' 키워드를 사용하면 새롭고 유일한 객체가 생성되어'Melee' 함수에 전달됩니다. 그러므로 각각은 그것 자신의 분리 된'weapon' 속성을 가질 것입니다. 그러나 @ Joseph의 코드에서'tool' 변수는 함수 범위 변수이므로 함수 외부에서 직접 변경할 수는 없습니다. 이를 위해서는'setTool' 메서드가 필요합니다. –