2014-03-30 4 views
0

JS에서 연결된 목록에 우수 guide을 팔로우하고 있습니다. 함수에 속성이나 메서드를 추가하는 것처럼 '점'표기법이있는 함수가 발생했습니다. 어떻게 작동하는지 모르겠습니다. 여기에 코드 스 니펫이 있습니다. (repl.it link)자체 메서드로 함수 만들기

function List(){ 
    List.makeNode = function(){ 
     return { 
      data: null, 
      next: null 
     }; 
    }; 
    this.start = null; 
    this.end = null; 

    this.add = function(data){ 
     if(this.start === null){ 
      this.start = List.makeNode(); 
      this.end = this.start; 
     } else { 
      this.end.next = List.makeNode(); 
      this.end = this.end.next; 
     } 
     this.end.data = data; 
    }; 
} 

var list=new List(); 

내 질문은 주로 2 행에 :

우리는 또한이 필요합니다 여기

List.makeNode = function(){} 

이 코드 줄이 무엇을하고 있는지 설명하는 텍스트의 라인입니다 쉬운 방법으로 노드와 하나의 가능한 방법을 만들려면 이 makeNode 메서드로 생성자 함수 List를 제공하는 것입니다.이 이 이상한 것처럼 보이면 함수가 또한에는 메소드와 속성이 있습니다. 이 방법은 클래스 또는 정적 메서드와 속성을 제공하는 것과 비슷합니다.

저는 생성자 함수의 개념을 이해합니다. 마지막 코드 줄에서는 List() 생성자를 호출합니다. 새로운 키워드는 객체를 포함 VAR 목록에 결과에 : 나는 'List.makeNode'을 대체하는 경우,

{ start: null, 
    end: null, 
    add: [Function] 
} 

또한과 (내 목록() 생성자의 라인 2) 'this.makeNode ...' 나는 목록 개체의 메소드로 makeNode 기능을 할 것이다 만드는 오전 내 VAR 목록 개체 :

{ makeNode: [Function], 
    start: null, 
    end: null, 
    add: [Function] 
} 

나는 목록() 궁극적 목적은 궁극적으로 Object.prototype에 모든 것을 상속 이해합니다. 이 List() 객체/생성자 함수에는 다음이 포함되어 있습니다.

{ [Function: List] makeNode: [Function] } 

저는 이것이 실제로 어떻게 작동하는지 잘 모릅니다.

  • MakeNode는 List 개체의 속성/메서드이며 List 함수도 포함되어 있습니까?
  • 왜 makeNode를 List와 연관시켜야합니까?
  • List를 'this'로 변경하고 makeNode 을 'List()'의 모든 새 인스턴스에서 사용할 수 있습니까?

왜 ListMakeNode를 사용하고 있는지, 왜 저장되어 있는지, 그리고 왜 이런 식으로 구현되는지에 대해 매우 분실했습니다.

감사합니다.

답변

3

아마도 오류입니다. 생성자의 (이 경우가 아니라 마지막으로 생성 된 인스턴스의 데이터에 액세스하려는 경우는 제외) 인스턴스가 생성 될 때마다하는 방법을 재설정 아무 소용이 없습니다

function List(){ 
    List.makeNode = function(){ }; 
    /* */ 
} 
List.makeNode; // undefined 
new List();  // This creates List.makeNode method 
List.makeNode; // function 
new List();  // This recreates List.makeNode method 

.makeNode 정말 List 방법을해야하는 경우가해야하는 경우

, 더 나은 접근 방식은

function List(){ 
    /* */ 
} 
List.makeNode = function(){ }; 

수 또는,이 인스턴스의 특권 방법 할 필요가있는 경우,

function List(){ 
    this.makeNode = function(){ }; 
    /* */ 
} 

또는 것 공개 메소드 인스턴스

function List(){ 
    /* */ 
} 
List.prototype.makeNode = function(){ }; 
3

makeNode는 List 함수도 포함하는 List 객체의 속성/메소드입니까?

이것은 단지 List 함수의 속성입니다. 모든 함수는 객체이므로 다른 모든 객체와 마찬가지로 함수에 속성을 할당 할 수 있습니다.

그러나 생성자 내에 할당을하는 것은 이상하지 않습니다.

function List() { 
    // ... 
} 

List.makeNode = function() { 
    // ... 
}; 

왜 우리는 목록과 관련된 makeNode을 유지해야합니까 :이 생성 된 후 "정적 방법은"단지 생성자에 할당해야 하는가?

대신 무엇을 하시겠습니까? function makeNode() { ... }과 같은 독립형 함수를 정의 할 수는 있지만 함수는 목록을 만드는 데만 사용되므로 어떤 식 으로든 List과 연결할 수 있습니다.

List를 'this'로 변경하고 'List()'의 모든 새 인스턴스에서 makeNode 함수를 사용하는 것이 큰 일입니까?

그것은 대신 List의 모든 자신의 사본 makeNode을 가지고 있다는 것을 의미한다. 함수 자체는 인스턴스 특정 속성에 의존하지 않으므로 그렇게하지 않아도됩니다.

당신 대신 List.prototype에 방법을 지정할 수 있지만, List 인스턴스가 그 기능에 액세스해야하는, 그래서 거기에 넣어 할 이유가없는 것처럼 여전히, 그것은 보이지 않는다.

+0

한 것과 같다 클래스 목록을 만들 수있는 쉬운 방법을 조금을 추가 할 경우

* "List Function"그가 말한 내용 – Bergi

+0

개인적으로 List 생성자의 로컬 함수로 만듭니다. 외부에서 볼 수있는 명백한 이유는 없습니다. 그것을 생성자 함수의 속성으로 만드는 것은 무언가 마치 교육학적인 이유에서와 같이 보인다. 내가 생각하는 견해. – Pointy

0

두 답변 모두 실제로 매우 좋습니다. 당신이 "목록 개체는"* 더 그 조금을 강조 할 수 있지만 내가 그들에게이

var List = (function() { 
    function List() { /*Your Constructor*/ }; 
    List.prototype.add = function() { /*this is a method on each object*/ }; 
    List.makeNode = function() { /*Static method on Class List*/ }; 

})(); 

var myList = new List(); 
var myNode = List.makeNode(); 
/* Do something with the node */ 
myList.add(myNode); 
관련 문제