2016-11-03 3 views
2
class Thing { 
    constructor(parameter) { 
    if (parameter) { 
     this.x = parameter; 
    } 
    return this; 
    } 

    getX() { 
    return this.x; 
    } 

    static specialThing() { 
    return new Thing('Special Thing'); 
    } 
} 

let thingy = Thing.specialThing(); 
thingy.getX(); // 'Special Thing' 

위의 내용을 JavaScript로 작성하고 싶습니다. (더 복잡한 형식 임에도 불구하고). 현재이 코드를 실행할 때 잘 실행되지만 클래스 내에서 함수를 사용하면 클래스의 인스턴스화 된 버전이 반환된다는 것에 이상하게 느껴집니다. 이 방법으로 내 코드를 작성하지 않는 이유가 있습니까?ES6 클래스를 사용하는 경우 정적 메서드에서 해당 클래스의 인스턴스화를 반환해도됩니까?

정적 메서드에 대한 작동 대안은 다음과 같습니다

Thing.specialThing =() => { 
    return new Thing('Special Thing'); 
}; 

이러한 것들 중 하나를 사용하여 몇 가지 장단점이 (있는 경우)은 무엇입니까? 내가 알지 못하는이 목표를 성취 할 수있는 다른 더 좋은 방법이 있습니까?

+1

그 문제에 아무것도가 없습니다. – Pointy

+0

이 구조는 다른 언어에서 매우 일반적입니다. 왜냐하면 클래스가 자바 스크립트에 익숙하지 않기 때문에 js에서 본 havent 유일한 이유입니다. –

+1

@Pointy & @Pamblam 응답에 감사드립니다! 일반적인 질문 - 답변하는 대신 답변으로 답변하는 이유는 무엇입니까? – thisissami

답변

3

ES6 클래스를 사용하는 경우 정적 메서드에서 해당 클래스 의 인스턴스화를 반환해도 괜찮습니까?

물론 괜찮습니다. 일부 상황에서는 허용되는 방식입니다. 일반적으로 생성자를 호출하고 객체를 생성하는 특정 방법으로 여러 곳에서 호출 할 수있는 재사용 가능한 기능으로 성문화하려는 경우에 사용됩니다.

정적 함수 (static function) specialThing을 팩토리 함수 (사용자를 대신하여 객체를 생성하고 반환하는 일반 함수)라고합니다. 팩토리 함수는 보여줄 수있는 정적 메서드, 다른 유형의 개체 또는 단순히 일반 함수 (기본적으로 모든 유형의 함수, 정적 또는 안) 중 하나 일 수 있습니다.

그래서 코드에서 생성자에 대해 같거나 거의 동일한 인수를 사용하여 동일한 유형의 객체를 모두 생성했다고 가정 해 보겠습니다. 코드를 네 곳으로 복사하는 대신 모든 공통 작업을 수행하는 공유 함수를 만든 다음 다른 일반적인 코드를 공유 함수에 넣는 것처럼 여러 위치에서 사용할 수 있습니다. 오브젝트를 작성하고 리턴 할 때를 제외하고, 그 유형의 공유 함수는 특정 이름 (팩토리 함수)을 갖습니다. 앞서 말했듯이, 팩토리 함수는 어떤 종류의 함수 (어떤 것이 든 여러분의 코딩 디자인에 가장 적합합니다)가 될 수 있습니다. 따라서 정적 메소드는 확실히 코딩 방법 중 하나입니다.

1

ES6 클래스의 경우 정적 메서드에서 해당 클래스의 인스턴스화를 반환해도됩니까?

함수형 프로그래밍에서 정말 일반적인 네는 너무

class Box { 
 
    constructor (value) { 
 
    this.value = value 
 
    } 
 
    fmap (f) { 
 
    return Box.of (f (this.value)) 
 
    } 
 
    concat ({value}) { 
 
    return Box.of (this.value + value) 
 
    } 
 
    static of (value) { 
 
    return new Box (value) 
 
    } 
 
} 
 

 
const sq = x => x * x 
 

 
let b = Box.of(3).fmap(sq).concat(Box.of(4).fmap(sq)) 
 

 
console.log (b) 
 
// { Box 3*3 + 4*4 } 
 
// { Box 25 }