2016-11-11 1 views
0

Ich benutze Knoten 6.9.1.Warum funktioniert super mit Methodensyntax, aber nicht mit Eigenschaftssyntax?

Ich definiere ein Basisobjekt wie folgt aus:

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

Jetzt habe ich einen Modifikator für die getFinalValue Methode definieren möchten.

Mein erster Versuch war das neue ES6 super Schlüsselwort zu verwenden:

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

jedoch der obige Code gibt mir die folgende Fehlermeldung:

> SyntaxError: 'super' keyword unexpected here 

Das hat ich versucht:

// 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) 

Die Ergebnisse waren der gleiche Fehler.

Allerdings, wenn ich die neue ES6 Methode Syntax:

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

Object.setPrototypeOf(modifier, base) 

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

Es funktioniert gut.

Wenn ich Object.getPrototypeOf statt super verwenden, funktioniert es die Eigenschaft Syntax:

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

Object.setPrototypeOf(modifier, base) 

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

Kann mir jemand erklären, warum dies geschieht?

S.S .: Ja, ich bin mir bewusst, ich mische ES5 und ES6 Syntax, aber das ist absichtlich.

Antwort

0

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

Das ist der Punkt. super in normalen Funktionen nicht erlaubt. Die specification Staaten

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.

Der Grund dafür ist, dass nur für Methoden ein Feld in der ihrer Umgebung Datensatz festgelegt ist, dass die JS-Engine den Wert von super lösen können. Eine Methodendeklaration ist nicht nur syntaktischer Zucker.

+0

Könnten Sie bitte Ihre Frage mit weiteren Details oder sogar einigen Links über die Spezifikationen hinaus erweitern? Vielen Dank. –

Verwandte Themen