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()?
Antwort
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:
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 usessuper
, this is the object whose[[GetPrototypeOf]]
provides the object where super property lookups begin.
dieses Beispiel Betrachten Sie (nicht mit einer beliebigen Klasse Syntax):
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 –
Ich habe jetzt ein Beispiel hinzugefügt, wie 'super' verwendet werden könnte – Bergi
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
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.
ok es gibt nur eine Sache, die ich nicht verstehe und dann werde ich es bekommen. Ist die ** super() ** repräsentiert die ** Klasse P ** –
Ich denke, jetzt ist die Methode zu P gehören, so dass 'super 'überhaupt nicht verfügbar wäre. . –
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() ' –
Vielleicht verwandt: https://esdiscuss.org/topic/any-tomethod-use-case#content-1 –
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. –
@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