2016-11-11 4 views
0

ノード6.9.1を実行しています。スーパーはメソッド構文では動作しますが、プロパティ構文では機能しないのはなぜですか?

私はこのようなベースオブジェクトを定義します。

const base = { 
    value : 10, 
    getFinalValue : function() { 
    return this.value 
    } 
} 

今、私はgetFinalValueメソッドの修飾子を定義したいです。

> SyntaxError: 'super' keyword unexpected here 

ザ・私が試した:

const modifier = Object.create(base) 
modifier.getFinalValue = function() { 
    return super.getFinalValue() + 20 
} 

しかし、上記のコードは私に次のエラーを与える:

私の最初の試みは、新しいES6 superキーワードを使用していた

// With Object.defineProperties within Object.create 
const modifier = Object.create(base, { 
    getFinalValue : { 
    value : function() { 
     return super.getFinalValue() + 20 
    } 
    } 
}) 

// And with Object.setPrototypeOf 

const modifier = { 
    getFinalValue : function() { 
    return super.getFinalValue() + 20 
    } 
} 

Object.setPrototypeOf(modifier, base) 

結果は同じエラーです。私は新しいES6メソッドの構文を使用している場合

しかし、:

const modifier = { 
    getFinalValue() { 
    return super.getFinalValue() + 20 
    } 
} 

Object.setPrototypeOf(modifier, base) 

modifier.getFinalValue() // 30 (yay!) 

をそれだけで正常に動作します。

私はObject.getPrototypeOfの代わりsuperを使用する場合は、プロパティの構文を使用して動作します:

const modifier = { 
    getFinalValue: function() { 
    return Object.getPrototypeOf(this).getFinalValue.call(this) + 20 
    } 
} 

Object.setPrototypeOf(modifier, base) 

modifier.getFinalValue() // 30 (Yay!) 

これが起こるんなぜ誰かが私に説明できますか?

P .:はい、私はES5とES6の構文を混同していることを認識していますが、これは目的に沿ったものです。

答えて

0

However, if I use the new ES6 method syntax ... It works just fine.

これがポイントです。 superは通常の機能では使用できません。 specification状態

It is a Syntax Error if FormalParameters Contains SuperProperty is true.

It is a Syntax Error if FunctionBody Contains SuperProperty is true.

It is a Syntax Error if FormalParameters Contains SuperCall is true.

It is a Syntax Error if FunctionBody Contains SuperCall is true.

理由は、唯一の方法のためにフィールドはJSエンジンはsuperの値を解決することができます自分の環境レコードで設定されていることです。メソッド宣言は文法的な砂糖だけではありません。

+0

ご質問をさらに詳しくお伝えいただくか、仕様を超えたリンクを提供してください。ありがとうございました。 –

関連する問題