2011-09-30 9 views
4

내가 생성자에서 다른 객체를 인스턴스화하고 그 자체에 대한 참조를 전달하는 클래스를 정의하기 위해 노력하고있어 현재 개체에 대한 참조 :생성자

var Child = function(m) { 
    var mother = m; 

    return { 
    mother: mother 
    } 
} 

var Mother = function() { 
    var children = makeChildren(); 

    return { 
    children: children 
    } 

    function makeChildren() { 
    var children = []; 
    for (var i = 0; i < 10; i++) { 
     var c = new Child(this);  // <--- 'this' is an empty object here 
     children.push(c) 
    } 
    return children; 
    } 
} 

이 작동하지 않습니다, 그리고 아동 인스턴스가 mother 속성에 빈 객체로 끝납니다. 이 작업을 수행하는 적절한 방법은 무엇입니까?

답변

3

자바 스크립트의 this은 어휘가 아닙니다. 즉, makeChildrenMotherthis이 아니라 자신의this이됩니다.

일반 변수를 설정하고 대신 사용하십시오.

var that = this; 
function makeChildren(){ 
    blabla = that; 
} 

내가이 일을 생각하지 않습니다하지만 단지 충분하다. 생성자에서 객체를 반환하면 this을 무시합니다. 새 개체를 반환하는 대신

this.children = children; 

대신 내용을 설정하십시오.

+0

'this.children = makeChildren()'을 설정했습니다. 이것은 생성자에서 객체를 반환하는 것보다 일반적으로 더 좋은 패턴으로 간주됩니까? – Andre

+0

'new' 문법을 사용하는 생성자를 수행 할 때'this'를 사용할 수 있습니다 (그리고 프로토 타입 등에서 상속받습니다). 자체 상수를 반환하는 함수를 가질 계획이라면 상속이나 프로토 타입 메소드에 액세스 할 필요가 없으므로 일반 비 생성자 함수로 만들 수 있습니다. (그리고 이름을 대문자로 만들지 말 것. '새로운'연산자가 필요한 것들을 위해 협약을 예약한다) – hugomg

1

당신은 어쩌면이 같은 어머니 객체 내에서 뭔가를 makeChildren()를 호출 할 때 어머니 객체에 대한 참조를 전달하는 시도 할 수 :

var Mother = function() { 
    var children = makeChildren(this); 
} 

makeChildren() 함수는 다음 인수로 받아 들일 수 당신이 사용할 수있는 참조 :

function makeChildren(ref) 
var c = new Child(ref); 

아무리 잘 작동할지 모르겠지만 시도해 볼 가치가있을 것입니다.

+1

마법의 'this' 변수로 게임을하는 것은 대개 발을 잃어 버리게됩니다.이 솔루션은 간단하고 직설적이며,'makeChildren'이 올바르게 작동하기 위해서는 특별한 방법으로 호출 될 필요가 없다는 점에서 나는이 솔루션을 좋아한다. –

1
중첩 된 기능은 부모로부터 this을 상속하지 않습니다

, 그래서 makeChildren()를 호출 할 때 명시 적으로 설정하지 않는 makeChildren()this는 어머니 생성자 내에서 this과 동일하지 않습니다 :

var children = makeChildren.call(this); 

하는 작업을해야 그 코드를 더 이상 변경하지 않아도됩니다. more detail about .call()에 대한 MDN을보십시오.

또는 당신 this에 대한 참조를 저장하고 기능에 그것을 전달할 수 있습니다 : 함수 내에서

var Mother = function() { 
    var self = this; // <-- new variable 

    var children = makeChildren(); 

    return { 
    children: children 
    } 

    function makeChildren() { 
    var children = []; 
    for (var i = 0; i < 10; i++) { 
     var c = new Child(self);  // <--- change 'this' to 'self' 
     children.push(c) 
    } 
    return children; 
    } 
} 

지역 변수가 중첩 된 기능에 액세스 할 수 있습니다.

+0

자기 변수는 어머니 기능 안에서만 액세스 할 수 있습니까? 당신이 명시 적으로 참조를 통과하지 않았다면? –

+0

@ jayp : 내부 함수는 범위에서 모든 변수를 사용할 수 있으며 여기에는 외부 함수의 변수가 포함됩니다. – hugomg

+0

어떤 이유로 저는 makeChildren이 내부 함수가 아니라 별도의 함수라고 생각했습니다. 분명히 올바르게 읽지 않았습니다. 감사. –

0
var Child = function(m) { 
    var mother = m; 

    return { 
     mother: mother 
    } 
}; 

var Mother = function() { 
    if (!(this instanceof Mother)) { 
     return new Mother(); 
    } 

    var that = this; 

    var makeChildren = function() { 

     var children = []; 
     for (var i = 0; i < 10; i++) { 
      var c = new Child(that); // <--- 'that' is the reference to Mother 
      children.push(c) 
     } 

     return children; 
    }; 

    var children = makeChildren(); 

    return { 
     children: children 
    } 
}; 

다음을 수행하십시오 Mother 객체의

var m = Mother(); 

처음 세 줄은 that의 값이 Mother 인스턴스가 아닌 전역 객체 있는지 확인합니다. 그것들이 없으면 항상 다음과 같이 써야합니다.

var m = new Mother();