2016-04-01 12 views
0

私は別のオブジェクトを返すオブジェクトを1つ持ち、すべてのマイクロインスタンスにいくつかのデータを渡します。これが私が達成しようとしていることです。別のクラスインスタンスを返す1つのクラスインスタンスを持つことはできますか?

export class Macro { 
    constructor(props) { 
    return (props) => { 
     return Micro(props) 
    } 
    } 
} 

export class Micro { 
    constructor(props) { 
    this.macro = props 
    } 
} 

let MicroInstance = new Macro({'happy': true}) 
let instance = new MicroInstance() 
console.log(instance.macro.happy) // true 

これは、エラーがスローされます。

_classCallCheck(this, Macro); 
         ^

ReferenceError: Macro is not defined 

アップデート1)

ここでは、このためのより現実的なユースケースです。私は、定義クラスからの情報を使用するカスタムエラーオブジェクトを作成しようとしています。つまり、同じパラメータをすべてLangErrorクラスに渡す必要はありません。 「sはそれに答えるJonathan Lonowskiを使用して

let languages = { 
    "en": { 
    "login_errors": { 
     "invalid_name": "Invalid Name: {name}!" 
    } 
    }, 
    "jp": { 
    "login_errors": { 
     "invalid_name": "無効な名前: {name}" 
    } 
    }, 
    "es": { 
    "login_errors": { 
     "invalid_name": "Nombre no válido: {name}!" 
    } 
    } 
} 

let LangError = new LangErrorDefinition({languages, nestedLocalesProp: 'login_errors'}) 
let error = new LangError('invalid_name', { name: 'Thomas' }) 
console.log(error.messages) 

// { en: 'Invalid Name: Thomas!', 
// jp: '無効な名前: Thomas', 
// es: 'Nombre no válido: Thomas!' } 

アップデート2)

ここjsfiddle動作します。

class Macro { 
    constructor(props) { 
    return() => { 
     return new Micro(props) 
    } 
    } 
} 

class Micro { 
    constructor(props) { 
    this.macro = props 
    } 
} 

let MicroInstance = new Macro({'happy': true}) 
let instance = new MicroInstance() 
console.log(instance.macro.happy) // true 

しかし、それでも私のローカルファイルにはバベルのエラーが表示されます。

/Users/thomasreggi/Desktop/project/test/error-suite.js:99 
    _classCallCheck(this, Macro); 
         ^

ReferenceError: Macro is not defined 
    at new Macro (error-suite.js:94:7) 
    at Object.<anonymous> (error-suite.js:108:21) 
    at Module._compile (module.js:398:26) 
    at loader (/Users/thomasreggi/.nvm/versions/node/v5.3.0/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:130:5) 
    at Object.require.extensions.(anonymous function) [as .js] (/Users/thomasreggi/.nvm/versions/node/v5.3.0/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:140:7) 
    at Module.load (module.js:344:32) 
    at Function.Module._load (module.js:301:12) 
    at Function.Module.runMain (module.js:430:10) 
    at /Users/thomasreggi/.nvm/versions/node/v5.3.0/lib/node_modules/babel-cli/lib/_babel-node.js:161:27 
    at Object.<anonymous> (/Users/thomasreggi/.nvm/versions/node/v5.3.0/lib/node_modules/babel-cli/lib/_babel-node.js:162:7) 

アップデート3)

上記のエラーは、私がbabel-node2015reactプリセットを使用しています、称賛日本語の文字を持つためです。

https://gist.github.com/reggi/cb9e83ce74de17da1ca2935b0bb3ff1d

+0

これは正しいですか?このスクリプトを実行している環境でサポートしていますか? –

+0

私はこの新しいJSのものはよくわかりませんが、あなたはコンストラクタからオブジェクトを返すと確信していますか?ファクトリメソッドがあるかもしれませんが、コンストラクタから何かを返すことは、私に大きな悪徳のように聞こえます。 –

+0

@NickZuberこれはES6ですが、これを行う正しい方法だとは思いません。 @JanTuroň 'Macro'オブジェクトが' Micro'のためのファクトリであるので、私はコンストラクタからオブジェクトを返したいと思います。 – ThomasReggi

答えて

4

実際にはありません。関数を含む任意のオブジェクトをコンストラクタが返すと、newインスタンスの代わりにそのオブジェクトをそのまま返します。

console.log(MicroInstance instanceof Macro); // false 
console.log(MicroInstance instanceof Function); // true 

念頭に置いて、これにかかわらず、Macro(またはLangErrorDefinition)だけで機能することができ、何が返すことは、新しいクラス(例えば、ModifiedMicro)である可能性があります。

これはまだ閉鎖(Macro)で作成した各ModifiedMicroのクラスの大部分を再定義を避けるために、継承(extends)を介してMicroを利用することができます。

  1. props引数が2回宣言されています

    export class Micro { 
        constructor(props, ...args) { 
        this.macro = props; 
        this.micro = args; 
        } 
    } 
    
    export function Macro(props) { 
        return class ModifiedMicro extends Micro { 
        constructor(...args) { 
         super(props, ...args); 
        } 
        }; 
    } 
    
    let MicroInstance = Macro({'happy': true}) // no need for `new` 
    let instance = new MicroInstance('one', 'two') 
    
    console.log(instance.macro.happy) // true 
    console.log(instance.micro)  // ['one', 'two'] 
    
    console.log(instance instanceof Micro); // true 
    

    [元の答え] Macroため

    constructorは、現在、2つの問題があります。

    constructor(props) { // 1st 
        return (props) => { // 2nd 
        // ... 
        } 
    } 
    

    第二の宣言が原因変数シャドウイングにMicro(props)に提供されますが、唯一の第一は、使用状況に値を与えられます。

    let MicroInstance = new Macro({'happy': true}) // 1st 
    let instance = new MicroInstance(/* props */) // 2nd 
    
  2. Micro(props)を返すときnewがありません:

    return new Micro(props) 
    

    これがなければ、TypeError

    が表示されます。あなたは予想通り

    Class constructor Micro cannot be invoked without 'new'

これらを調整すると、console.log()trueを報告する必要があります:

export class Macro { 
    constructor(props) { // keep 1st `props`, removing 2nd 
    return() => { 
     return new Micro(props) 
    } 
    } 
} 
+0

2つのアップデートで私の質問が更新されました。私が提示しているユースケースでは、エラーが生成されたときにnewを呼び出さなければならないと感じましたか?エラーオブジェクトであれば、マクロが返すanon-function内からnewを呼び出すことはできますか? 2番目の問題は、あなたの答えが私のローカルバーベルで動作していないということです。私は上記のエラーを受け取ります。 – ThomasReggi

+0

私はここでエラーを追跡しました。それは、日本の表彰台の文字のためです。 https://gist.github.com/reggi/cb9e83ce74de17da1ca2935b0bb3ff1d – ThomasReggi

+1

@ThomasReggi Hmm。 "raw"ファイルをコピーしてくれます。エディタのエンコーディングがファイルを保存していることを知っていますか?ノードは一般的にUTF-8をデフォルトにする/仮定しているので、他のエンコーディングはコードポイント文字( ''無効な名前 ''のような)を含む奇妙な結果を引き起こす可能性があります。 –

0
export function Macro(props) { 
    return function() { this.macro = props } 
} 

は(脂肪矢印機能を使用せずに述べた機能を提供することができることはできませんコンストラクタとして使用することもできます)、プロトタイプチェーンとやり取りすることもできます。

new Macroコールのnewはノイズであるため、省略する必要があります。これは、Macroが(異なる)関数オブジェクトを返すので、Macroが呼び出されると、Macro.prototypeにプロトタイプされた新しいマクロインスタンスオブジェクトを作成し、インスタンスオブジェクトを破棄するようにします。

関連する問題