2013-04-20 2 views
0

고려 다음의 예프로토 타이핑

var Foo = function(){ 
    this.identity = 'Foo'; 
}; 
Foo.prototype.bar = function(){ 
    this.identity = 'bar'; 
}; 
var fooInstance = new Foo(), 
    bar = new fooInstance.bar(); 

나는 fooInstance 변수를 얻을 수있는 방법 bar

, 질문? Foo의 자녀가 부모를 fooInstance으로 인식 할 수있는 방법이 있습니까? 예를 들어, barfooInstance을 반환하는 함수를 어떻게 만들 수 있습니까? 약간주의해야 할 점은 bar는 prototype 명령을 사용하여 만들어 져야하며 Foo에 중첩되어 단순히 그런 식으로 Foo 인스턴스에 액세스 할 수는 없다는 점입니다.

내 아이디어

왜 그들은 작동하지 않음

차라리 사용하지 것이다 쉽게 읽을 수있는 코드를 작성하는 목적으로하지만 너무

var Foo = function(){ 
    this.identity = 'Foo'; 
}; 
Foo.prototype.createBar = function(){ 
    var parent = this; 
    function bar(){ 
     this.parent = parent; 
     this.identity = 'bar'; 
    }; 
    return new bar(); 
}; 
var fooInstance = new Foo(), 
    bar = fooInstance.createBar(); 

같은 기능을 다시 할 수있을 것입니다 필요하지 않다면이 방법.

또한 명확한 설명

날 맥락에서 질문을 넣어 보자. 캔버스 요소의 모든 컨텍스트에 새 메서드가 포함되도록 CanvasRenderingContext2D에서 프로토 타입을 작성하고 있습니다. 그 메소드 foo를 호출 해, 문맥이 작성된 캔버스 문맥이라고 가정합니다. foo 함수가 컨텍스트 변수를 사용할 수 있도록 "new context.foo()"와 같은 변수를 만드는 방법은 무엇입니까?

+1

는'fooInstance' 무엇입니까? 'Foo'의 '어린이'와 '부모'는 무엇입니까? 당신이 전화하고 있지만 정의하지 않는 그'bar' 메소드는 무엇입니까? "프로토 타입 명령"이란 무엇입니까? – Bergi

+0

Btw, [이 답변] (http://stackoverflow.com/questions/13418669/javascript-do-i-need-to-put-this-var-for-every-variable-in-an-object/13418980# 13418980) 변수와 속성 간의 차이점을 이해하는 데 도움이 될 수 있습니다. – Bergi

+0

나는 문맥 안에 질문을 두게한다. 캔버스 요소의 모든 컨텍스트에 새 메서드가 포함되도록 CanvasRenderingContext2D에서 프로토 타입을 작성하고 있습니다. 그 메소드 foo를 호출 해, 문맥이 작성된 캔버스 문맥이라고 가정합니다. foo 함수가 컨텍스트 변수를 사용할 수 있도록 "new context.foo()"와 같은 변수를 만드는 방법은 무엇입니까? –

답변

1

가 어떻게 그 기능 (new로) 생성자로 호출하면 fooInstance

을 반환 표시 줄에서 함수를 만들 수 있습니다, 당신이 정말로 그것을 할 수 없습니다. this keyword, "부모"(메서드를 호출 한 개체)에 대한 유일한 참조는 생성자 호출에서 새 인스턴스로 설정됩니다.예를 들어, 부모 생성자 함수 (당신을 위해 작동하지 않음)에서 생성자를 생성하거나 프로토 타입의 클로저에서 생성자를 반환하여 클로저로만 참조를 얻을 수 있습니다 (두 번째 예제에서 거의 얻은 것입니다).) :

Foo.prototype.getBarCoonstructor = function() { 
    var parentFoo = this; 
    return function Bar() { 
     // constructor things 
     // using "parentFoo" reference 
    }; 
}; 
// Usage: 
var bar = new (foo.getBarConstructor())(); // ugly. 

대신 getBarConstructor의 모든 호출에 대한 새로운 생성자를 만드는 더 나은 당신은 방법 밖에 넣어해야하며 인수로 parentFoo을 넣어. 당신의 아이디어는 이미 꽤 좋았습니다.

function Bar(parent) { 
    // constructor things, referring "parent" 
} 
Bar.prototype.… = …; 

Foo.prototype.createBar = function() { 
    return new Bar(this); // passing the Foo instance 
}; 

(@plalx는 동일한 솔루션을 가지고 있지만, 모듈 폐쇄에 싸여)

+0

고맙습니다. 문제는 "this"가 함수 사이의 유일한 상향 관계이며 생성자를 사용하면 효과적으로 제거한다는 것입니다. 이것은 자바 스크립트가 나를 좌절시키는 순간 중 하나입니다. –

0

Foo.prototype.bar은 단순히 Object of Foo의 함수입니다. 이 함수가 스코프 체인에서 명시 적으로 정의하지 않는 한 '부모'를 알 수있는 방법은 없습니다.

e.e. 만약 당신이 그렇게한다면

var Foo = function(){ 
    this.identity = 'Foo'; 
}; 
var fooInstance = new Foo(); 

Foo.prototype.bar = function(){ 
    console.log(fooInstance); // retrieve from scope 
    this.identity = 'bar'; 
}; 
bar = new foo.bar(); 

그게 작동합니다. 당신이 bar 개체에서 fooInstance 객체를 참조해야하는 경우

+0

예,하지만 일단 fooInstance가 하나 이상 생성되면 해당 메서드가 중단됩니다. 코드는 동적이어야합니다. 각 fooInstance는 고유하며 각 막대 인스턴스는 고유 한 상위 항목을 가져올 수 있어야합니다. –

2

, 당신은 다음과 같이 의존성 주입을 사용할 수

Foo.prototype.bar = function(fooInstance) { 
    this.identity = 'bar'; 
    this.fooInstance = fooInstance; 
}; 

var fooInstance = new Foo(), 
    bar = new foo.bar(fooInstance); 

당신은 Foo에 공장 기능을 구현하여 작성 프로세스를 단순화 할 수있다.

Foo.prototype.createBar = (function() { 
    function Bar(parent){ 
     this.parent = parent; 
     this.identity = 'bar'; 
    }; 

    return function() { 
     return new Bar(this); 
    }; 
})(); 

var fooInstance = new Foo(), 
    bar = fooInstance.createBar(); 
+0

이것은 정확하게 내 아이디어이기도하지만 API를 디자인하고 있으며 사용자로 사용하기가 번거롭다. 그러나 팩토리 메서드는 인자를 전달해야하는 귀찮은 필요성을 없애지 만, 논리적으로는 새로운 접두사를 사용하는 것이 더 합리적이며 사용자를 위해 논리를 유지하려고합니다. 하위 메소드가 원래 객체를 동적으로 가져올 수 있습니까? 일반적으로 바인딩과이를 사용하는 것은 그 일을 성취 할 수 있지만 여기에 적용되지 않는 생성자의 특성 때문에 ... 다른 방법이 있습니까? –

관련 문제