2017-07-03 7 views
0

ルックを渡す:ES6は、以下の例では、コンストラクタにオブジェクトと設定プロパティ

class Parent { 
    constructor({ parentOnlyArg = 'default value' } = {}) { 
     this.parentOnlyArg = parentOnlyArg; 
    } 
} 

class Child extends Parent { 
    // this class and also any class inheriting from it 
    constructor({ visibleStyle = 'inline' } = {}) { 

     // I want to pass argument to super as an object 
     super(/** args **/); 

     this.visibleStyle = visibleStyle; 
    } 
} 

class Child2 extends Parent { 
    // Specifying parentOnlyArg as default will change the behaviour 
    constructor({ parentOnlyArg = 'another parent value', 
        someOther = 'value' } = {}) { 

     // I want to pass argument to super as an object 
     super(/** args **/); 

     this.someOther = someOther; 
    } 
} 

それがスーパーにコンストラクタの引数に渡すことは可能ですか?

は私が

super(...arguments); 

を考えていたよりも、それは単純だったように私は、クイック勝利argumentsオブジェクトを使用することです

var c1 = new Child(); // c.parentOnlyArg = 'default value' 
var c2 = new Child2(); // c.parentOnlyArg = 'another parent value' 
var c3 = new Child({ parentOnlyArg: 'changed again' }); // c.parentOnlyArg = 'changed again' 
+0

なぜ[MCVE] '<>'スニペットエディタを使用して投稿しませんか? – mplungjan

+2

'super({parentOnlyArg})? – Bergi

+0

あなたの関数の本体に破壊を移さない理由は何ですか?次に、渡す変数への参照があります。 – loganfsmyth

答えて

1

を使用してChildを作成することができますようです。これは、関数に渡されるすべてのパラメータを含む配列です。

MDNの詳細情報

実際には、arguments[0]のおかげで、関数の最初のパラメータにアクセスできます。

class Child extends Parent { 
    constructor({ parentOnlyArg = 'value', 
        visibleStyle = 'inline' } = {}) { 
     super(arguments[0]); 
     [...] 
    } 
} 
+0

これは間違っているわけではありませんが、これは1週間前にやる方法です。他のオプションがない場合、これが答えになります。 – Asken

1

object destructuring with rest propertiesを使用できます。ブラウザではまだ実装されていませんが、BabelJsはそれを翻訳することができます。上記のスニペットの親クラスで

function assertEmpty(obj) { 
 
    if (Object.keys(obj).length > 0) { 
 
    throw new Error("Unexpected parameters"); 
 
    } 
 
} 
 
    
 
class A { 
 
    constructor({ a = "foo", ...rest } = {}) { 
 
    assertEmpty(rest); 
 
    console.log("new A " + a); 
 
    } 
 
} 
 
    
 
class B extends A { 
 
    constructor({ b = "bar", ...rest } = {}) { 
 
    super(rest); 
 
    console.log("new B " + b); 
 
    } 
 
} 
 
    
 
new B({a:2}); // prints 'new A 2', 'new B bar' 
 
new B({a:4, b:5, c:6}); // throws 'Unexpected parameters'

子孫によって消費のparamsは表示されません。問題がある場合は、@Bergiまたは@loganfsmythのどちらかとしてそれを行うことができます。たとえば:

class A { 
 
    constructor(params = {}) { 
 
    const { a = "foo" } = params; 
 
    console.log("a=" + a); 
 
    } 
 
} 
 

 
class B extends A { 
 
    constructor(params = {}) { 
 
    const { b = "bar" } = params; 
 
    super(params); 
 
    console.log("b=" + b); 
 
    } 
 
} 
 

 
new B({a:2}); // prints a=2 b=bar 
 
new B({b:5}); // prints a=foo b=5

+0

私が更新したところで、 'super arguments 'に' ... arguments'を渡すだけで、それもうまくいくと思われ、すべての引数を親に渡してデフォルト値を保持します。あなたはその解決策に何か問題を見ますか? – Asken

+0

唯一の問題はパフォーマンスに関連している可能性があります。現代のブラウザでは、引数オブジェクトにアクセスする関数を最適化できません。しかし、そうでなければ大丈夫です。 –

関連する問題