2014-12-16 5 views
9

Ich bemerkte, dass die Function.prototype eine toMethod() Methode in experimentellem JavaScript hat, aber was macht das eigentlich? Und wie benutze ich es?Was macht Function.prototype.toMethod()?

+1

Vielleicht verwandt: https://esdiscuss.org/topic/any-tomethod-use-case#content-1 –

+0

Ich habe noch nie irgendwelche Mixins oder Klassenkompositionen gemacht, wenn es um Vererbung geht. also verstehe ich immer noch nicht, worüber sie reden oder wie man es benutzt. –

+1

@Edwin - Ich denke nicht, dass es für den gelegentlichen JavaScript-Entwickler gedacht ist. Es ist eine sehr tiefe Level-Funktion für die Verwendung in fortgeschrittenen JavaScript-Bibliotheken, die von einigen Merkmalen der Prototyp-Vererbung abhängen, die ebenfalls im "experimentellen" Status sind (wie die "' super() '" - Funktion) – JDB

Antwort

10

Update: Die toMethod Methode war nur experimentell und hat es nicht in den Standard geschafft. Das Home-Objekt im Wesentlichen statisch ist jetzt der einzige Weg, super zu manipulieren, ist die [[Prototyp]] zu ändern:

zur bind Methode der Funktionsobjekte
var base = {…}; // as below 
var obj = Object.setPrototypeOf({ 
    foo() { // needs to use method definition syntax 
     super.foo(); 
    } 
}, base); 
obj.foo(); 

Es ist sehr ähnlich. Anstatt jedoch eine neue Funktion mit einem gebundenen this Wert zu schaffen, schafft es eine neue Funktion mit einer gebundenen [[HomeObject]], was die Referenz, die für super Anrufe verwendet:

[[HomeObject]] (Object): If the function uses super , this is the object whose [[GetPrototypeOf]] provides the object where super property lookups begin.

dieses Beispiel Betrachten Sie (nicht mit einer beliebigen Klasse Syntax):

+0

Ich verstehe, wie man bind verwendet und dass es eine neue Funktion mit einem anderen Kontext zurückgibt, aber das ** [[HomeObject]] **, das ich nicht verstehe –

+0

Ich habe jetzt ein Beispiel hinzugefügt, wie 'super' verwendet werden könnte – Bergi

+0

Ich bin nicht vertraut mit, wie das alles funktioniert, aber es scheint wie es sein sollte 'obj.bar = obj.foo.toMethod (Basis);', oder? Setzen Sie das '[[HomeObject]]' nicht auf 'base'? – JDB

-1

Mein Verständnis ist, dass .toMethod ist wie das Klonen einer Funktion. Betrachten Sie das Beispiel in der Quelle, die ich geschrieben,

class P { } 
class C extends P { 
    foo() { 
     console.log("f"); 
     super(); 
    } 
} 
P.prototype.foo=C.prototype.foo; 
(new C).foo(); 

Sie hier eine Unterklasse Methode .foo in der übergeordneten Klasse verweisen, so dass, wenn Sie .foo nennen, wird es P ‚s .foo die C ist‘ Referenz s .foo und Sie müssen nur erstellt eine Schleife.

Es scheint, wie dieses Problem zu lösen, können Sie .toMethod welche „Klone“, um die Funktion verwenden und geben ihm eine andere super/„Home“, die Sie specifed:

P.prototype.foo = C.prototype.foo.toMethod(P.prototype); 

jetzt (new C).foo() Aufruf würde nicht weitergehen für immer.

+0

ok es gibt nur eine Sache, die ich nicht verstehe und dann werde ich es bekommen. Ist die ** super() ** repräsentiert die ** Klasse P ** –

+0

Ich denke, jetzt ist die Methode zu P gehören, so dass 'super 'überhaupt nicht verfügbar wäre. . –

+0

vor dem Aufruf ** ** toMethod ist das gleiche in ES5: 'Funktion P() {}' ' Funktion C() {}' ' C.prototype = new P();' 'C.prototype.foo = function() { console.log ('f'); P(); } ' ' P.prototype.foo = C.prototype.foo; ' ' (neue C) .foo() ' –