2011-09-11 8 views
2

나는 오늘 시험에서 다음과 같은 질문을했다. 하지만 전에 functionName.VariableName과 같은 것을 보지 못했습니다. 어떻게 작동하는지 잘 모릅니다. 위의 코드 문제자바 스크립트 질문 : functionName.VariableName?

function Item(itemName) 
{ 
    var next_item_id = 1; 

    Item.item_name = itemName; 
    Item.item_id = next_item_id++; 
} 

var Item1 = Item('Desktop'); 
var Item2 = Item('Laptop'); 
var Item3 = Item('Monitor'); 
  1. 아무것도 : 당신이 나에게 솔루션을 알 수있는 경우

    좋은 것

    ? 그렇다면 그것을 고쳐라. (내가 볼 수있는 문제는 next_item_id가 항상 1이며 전역으로 만들어야합니까?)
  2. 런타임에 변수 "next_item_id"를 수정할 수 없도록 함수를 수정합니다.
  3. 내 자신의 질문, 어떻게 Item.item_name 같은 변수가 작동합니까? 나는 그것을 검색하고 싶지만, 나는 무엇을 검색해야하는지 잘 모르겠다.

감사합니다.

답변

2
  1. 다음 next_idem_id는 항상 1이지만 글로벌 이름 공간을 오염시키는 것은 일반적으로 권장되지 않습니다. 대신, 익명 함수에 포장 : 또한

    (function() { 
        var next_item_id = 1; 
    
        function Item(itemName) 
        { 
         //Use "this" to apply the property to the instance only 
         this.item_name = itemName; 
         this.item_id = next_item_id++; 
        } 
    
        var Item1 = new Item('Desktop'); 
        var Item2 = new Item('Laptop'); 
        var Item3 = new Item('Monitor'); 
    })() 
    

를 자바로, 자바 스크립트에서 일반적으로 가장 좋은 방법은 낙타 표기법보다는 under_scores을 사용하는 것입니다. 생성자는 일반적으로 UpperCamelCase에 있습니다.예를 들면 :

Array //UpperCamelCase 
Object.prototype.toString //toString is camelCase 
  1. 이 질문은 모호하고, 해석에 따라 가능한 답의 숫자가있을 수 있습니다. next_item_id은 함수 내에서 선언 된 "var"이며 내부에는 [[DontDelete]][[DontEnum]] 플래그가 있습니다. 변수가 "var"이고 수정 된 코드에서 "this"를 사용하지 않으면 변수는 본질적으로 함수 또는 중첩 된 함수 외부에서 액세스 할 수 없으므로 수정할 수 없습니다. 비표준 const을 사용하거나 객체를 만들고 Object.defineProperty를 사용하여 ES5 호환 환경 등을 가정 할 때 false를 반환하는 setter를 만들 수 있습니다.

  2. 함수는 Javascript의 객체입니다. 모든 개체는 "속성"을 가질 수 있습니다.

2

자바 스크립트 함수도 객체이며 속성을 가질 수 있습니다.

이들은 Java에서 static 필드처럼 동작합니다.

+1

+1이 유일한 정답입니다. OP의 실제 질문에 답하는 대신 테스트 질문을 "해결하는"모든 사람들이 필요합니다. – Rick

2

당신은 완전히 잘못 될 것입니다. 내부 변수를 설정하려고한다고 가정합니다.

function Item(itemName) 
{ 
    var next_item_id = 1; 

    this.item_name = itemName; 
    this.item_id = next_item_id++; 
} 

var Item1 = new Item('Desktop'); 
var Item2 = new Item('Laptop'); 
var Item3 = new Item('Monitor'); 

이 모두 ITEM_NAME의와 ITEM_ID 공개적으로 사용할 수 있습니다 :

당신이 '생성자'를 만들려면

이 그런 짓을. 사용은 당신이 원하는 것처럼 next_item_id 수 있도록하려면 다음을 수행하십시오

생성자에서 다음
Item.next_item_id = 1; 

이 Item.next_item_id 할 ++;

귀하의 최종 코드는 다음과 같이 보일 것이다 :

function Item(itemName) 
{ 
    this.item_name = itemName; 
    this.item_id = Item.next_item_id++; 
} 

Item.next_item_id = 1; 

var Item1 = new Item('Desktop'); 
var Item2 = new Item('Laptop'); 
var Item3 = new Item('Monitor'); 

이것이 객체 항목에 속성을 부착됩니다하고있다. 당신은 "아이템은 기능입니다! 어떻게 가능합니까?!"라고 생각할 수도 있습니다. 거의 모두 JavaScript에서은 변경 가능한 속성이있는 개체입니다. 그렇지 않은 키워드는 null 및 undefined (AFAIK)뿐입니다.

항목은 여전히 ​​함수이지만 next_item_id 속성도 있습니다.

또한 new를 사용하면 새 인스턴스가 만들어집니다. 이것은 Java 및 다른 프로그래밍 언어와 유사한 개념입니다. Item을 호출하는 것은 함수를 호출하는 것과 같습니다. 그리고 명시 적 return 문을 통해 리턴 된 모든 것을 돌려받습니다. 그렇지 않으면 정의되지 않습니다.

0

질문 2에 대한 답변 : "next_item_id"변수를 런타임 중에 수정할 수 없도록 함수를 수정하십시오.

질문을 올바르게 해석했다면 Item.item_id를 생성자 외부의 어떤 곳에서도 수정할 수없는 상수로 사용하고 싶습니다. 저는 JS에서 상수를 가질 수 있다고 생각하지 않습니다.

Item1.item_id = someValue 

위 줄에는 Item1의 item_id 값을 변경할 수있는 곳이 있습니다.