2017-05-03 2 views
3

클래스 생성자가 정적 메서드를 호출 한 결과를 반환하는 상황이 있습니다.Javascript 클래스의 정적 메서드에서 멤버 함수를 참조하는 올바른 방법

그러나 정적 메서드에서는 멤버 함수 여야하는 함수를 호출해야하지만 멤버 함수이면 사용할 수 없습니다.

이렇게하는 좋은 방법이 있습니까?

이 코드는 분명히 도움이 될 것입니다

여기 modifyProgram
class Program { 
    constructor (paths) { 
    this.inputs = {} 
    this.program = Program.createProgram(paths) 
    return this.program 
    } 

    static createProgram() { 
     const return_program = {name: test} 
     // async function executes 
     this.modifyProgramName() // This is an error because modifyProgram name is not static on this class 
     return return_program 
} 

modifyProgramName() { 
    // Execute a promise 
    fetch('someresource').then(() => { 
    this.program.name = 'newName' 
    }, 500) 
} 

정말 static 안된다 "수정"의 의미는 프로그램이 이미 존재하기 때문이다.

그러나 본질적으로 생성자 인 createProgrammodifyProgram을 호출하려는 경우 Program 클래스의 인스턴스가 아직 존재하지 않기 때문에 설치할 수 없습니다.

이렇게하는 좋은 방법이 있습니까?

+0

왜'createProgram()'정적? 당신이 현재의 문제를 극복했다고 가정 할 때, 당신은 어떻게 위의 클래스를 사용할 것입니까? – nnnnnn

+0

'createProgram'은 프로그램을 반환하기 위해 생성자에서 호출되기 때문에 정적입니다. 정적이 아닌 경우 생성자에서 호출 할 수 없습니다. – Startec

+0

당신은 여전히 ​​생성자에서 메서드를 호출 할 수 있어야합니다. 나는 당신에게 보여줄 나의 대답을 업데이트 할 것이다. –

답변

1

this을 정적 함수로 전달해보세요. 이처럼 : 콘솔에서

class Program { 
    constructor (paths) { 
    this.inputs = {} 
    this.program = Program.createProgram(paths, this) 
    return this 
    } 

    static createProgram (paths, program) { 
     const return_program = {name: "test"} 
     // async function executes 
     program.modifyProgramName() // This is an error because modifyProgram name is not static on this class 
     return return_program 
    } 
    modifyProgramName() { 
    setTimeout(() => { 
     this.program.name = 'newName' 
    }, 500) 
    } 
} 

결과 : 나는 this이 개체에서 하나가 될 수 있도록 => 형식을 사용하도록 setTimeout을 변경

pgm = new Program(["/one"]); 
Program {inputs: Object, program: Object} 
pgm.program.name 
"newName" 

참고. 정적으로 createProgram이 필요하지 않은 경우

, 다음이 작동합니다

class Program { 
    constructor (paths) { 
    this.inputs = {} 
    this.program = this.createProgram(paths) 
    return this 
    } 

    createProgram (paths) { 
     const return_program = {name: "test"} 
     // async function executes 
     this.modifyProgramName() // This is an error because modifyProgram name is not static on this class 
     return return_program 
    } 
    modifyProgramName() { 
    setTimeout(() => { 
     this.program.name = 'newName' 
    }, 500) 
    } 
} 

pgm = new Program(["/one"]); 
Program {inputs: Object, program: Object} 
pgm.program.name 
"newName" 
1

그 나쁜 생각은 '이'생성자 내에서이 상속을 깰 수 있으므로이 아닌 다른 뭔가를 반환 할 수 있습니다.

어떤 경우에도 setTimeout에 function 키워드를 사용하는 함수가 전달되면 'this'키워드가 전역 범위를 가리키고 있음을 의미하는 전역 컨텍스트에서 실행됩니다. 그걸 다루는 한 가지 방법은 es6 fat 화살 함수를 사용하거나 'bind'키워드를 사용하는 것입니다.

(function() { 
    this.program.name = 'newName'; 
}).bind(this) 

https://jsfiddle.net/uvwt9eqd/1/

+0

이것이 일을 바꿀지는 모르겠지만'setTimeout'을 간단한 데모로 사용했습니다. 실제로 웹 요청이 이루어집니다. 질문이 업데이트되었습니다. – Startec

+0

아무 것도 변경되지 않습니다. @Steve가 함수를 제안하거나 바인딩 할 때 화살표 기능을 사용하십시오. – derp

+0

* "어떤 경우이든 문제는"* - "문제"가 아니며 코드가 변경 될 때까지는 발생하지 않는 2 차적인 문제입니다 어떻게 든'modifyProgramName()'이 처음부터 호출되도록 허용하는 것입니다. – nnnnnn

관련 문제