2017-01-29 3 views
0

私はバベルを使ってES7のデフォルトオプションを試そうとしています。ここで私は何ができるかです:名前のつけられたデフォルトのES6パラメーター(破棄されていない)

class Foo { 
    constructor({key='value', foo='bar', answer=42}) { 
    this.key = key; 
    this.foo = foo; 
    this.number = number; 
    } 
} 

これは、この例のために働くかもしれないが、私は、私は非常に大規模な設定オブジェクトのために割り当てることができる方法を知っているしたいと思います。ここは私がしたいことの一例です:

class Foo { 
    constructor(opts = {key='value', foo='bar', answer=42}) { 
    this.opts = opts; 
    } 
} 

しかし、これはコンパイルされません。私はこのようにそれを実行しようとしました:

class Foo { 
    constructor(opts = {key:'value', foo:'bar', answer:42}) { 
    this.opts = opts; 
    } 
} 

しかし、それは、オブジェクト全体を置き換える、次のように:

let foo = new Foo({key: 'foobar'}); 

console.log(foo.opts); 
// {key: 'foobar'} is what is displayed 
// When I want {key: 'foobar', foo:'bar', answer:42} 

答えて

2

私はあなたが(任意のキーを持つパラメータとしてオブジェクト)ES6オプションのパラメータでこれを行うことができるとは思いませんコンストラクタを呼び出すと、新しい参照を持つ新しいオブジェクトになるためです。それは交換されているからです。

大きなオプションオブジェクトを処理したい場合は、デフォルトのオプションオブジェクトをどこかに格納し、オブジェクトをインスタンス化するときに渡されたものとマージします。そのような

何か:

class Foo { 

    constructor(opts) { 
    this.opts = Object.assign({}, Foo.defaultOptions, opts) 
    console.log(this.opts) 
    } 
} 

Foo.defaultOptions = { 
    key: 'value', 
    foo: 'bar', 
    answer: 42 
} 

let foo = new Foo({key: 'another value'}) 
//{ key: 'another value', foo: 'bar', answer: 42 } 

あなたが(それは深いマージを実行していないことに注意してください - ネストされたオブジェクトが置き換えられます)Object.assignと合併することができます。

babelを使用しているときに、デフォルトのオプションObjectをクラス変数として宣言したい場合(末尾、クラス宣言後、またはコンストラクタ内ではありません)、thisプラグインを使用して、

class Foo { 

    defaultOptions = { 
     key: 'value', 
     foo: 'bar', 
     answer: 42 
    } 

    constructor(opts) { 
     this.opts = Object.assign({}, this.defaultOptions, opts) 
     console.log(this.opts) 
    } 
} 

読みやすくなっています。

2

それはそれは、特定のES6の非構造の機能ではありません

class Foo { 
    constructor({key='value', foo='bar', answer=42} = {}) { 
    ... 
    } 
} 

ですECMAScript 7(ECMAScript Next)への提案。それは通常、オブジェクトのクローン作成/マージで行われる構造化代入なし

Object.assignが助けに来る:

class Foo { 
    constructor(opts = {}) { 
    this.opts = Object.assign({ 
     key: 'value', 
     foo: 'bar', 
     answer: 42 
    }, opts); 
    } 
} 
+0

申し訳ありませんが、私の投稿が実際にはっきりしていないことを認識しました。だから私はタイトルを編集しました。私はパラメータを無効にしたくない – Vinz243

+0

オブジェクトを手動でコピーする必要があります。私は通常それを使用するレシピで答えを更新しました。 – estus

+0

それは私が最後にやったことです。私はES6/7でそれをやることができるかどうかを知りたかっただけです。ありがとう! – Vinz243

関連する問題