instance.replaceMe(40).revealVar();
avvisi 42
OK, per che return MyClass.staticHelper(this, value);
sarebbe sufficiente. La questione è solo se la chiamata successiva a instance.revealVar()
dovrebbe avvisare 2 o 42 - se si vuole instance
di essere cambiato a 42 diventa più complicato:
this = MyClass.staticHelper(value); // this will fail
... perché this
non è una variabile comune, ma un parola chiave e evaluates to the value of the ThisBinding of the current execution context che is set depending on how the function is entered - non è possibile assegnarlo, è possibile impostarlo solo quando si richiama la funzione.
Non voglio assegnare manualmente tutte le variabili interne ogni volta, ma piuttosto sostituire l'intero oggetto.
Purtroppo c'è un devi fare così, senza modificare le proprietà di instance
oggetto (e le variabili di chiusura nascosto) di non modificare la instance
e revealVar()
rimarrà 2.
Is modo semplice per farlo?
Sì, può essere fatto a livello di programmazione.Il metodo più semplice sarebbe quella di call il costruttore (di nuovo) sul l'istanza corrente, come accade quando invocato con l'new
keyword:
MyClass.call(instance, instance.myVar + value);
Eppure non è possibile utilizzare questo come la funzione statica che crea un completamente nuova istanza. O lo si inserisce in un metodo statico e lo si chiama da replaceMe
con this
oppure lo si inserisce direttamente in replaceMe
.
Se avete bisogno di un metodo statico che in un primo momento restituisce una completamente nuova istanza, si potrebbe usare anche quello copiando le nuove proprietà sul vecchio esempio:
….replaceMe = function(val) {
var newInst = MyClass.staticHelper(this, val); // new MyClass(this.myVar+val);
for (var prop in newInst)
if (newInst.hasOwnProperty(prop))
this[prop] = newInst[prop];
return this;
};
Ciò significa sovrascrivendo i vecchi attributi, e anche le vecchie chiusure possono essere raccolte dai rifiuti ora che nulla si riferisce più a loro.
Btw, mi consiglia di put your methods on the prototype instead of assigning them in the constructor.
Sembra che tu voglia solo restituire MyClass.staticHelper (this, value); '. Non puoi sostituire "questo", ma puoi restituire un nuovo oggetto simile. –
Questo restituirà solo il nuovo oggetto all'interno di una catena di chiamate, ma in realtà non sostituirà l'istanza. –
Sì, non è possibile. Puoi creare un wrapper per l'intera classe e mantenere comunque un riferimento interno all'istanza attuale. –