Volevo replicare di più o meno un metodo variabile o statico di Java
Non provare a programmare in una lingua come se fosse un altro, invece, impara come funziona la nuova lingua e continua la tua linea. Perché vuoi usare JavaScript per sembrare Java? Basta non farlo.
Il concetto di proprietà o metodo statico in Java significa che tale proprietà o metodo non dipende da un’istanza, se non, della stessa classe. Cosa capisci di questo? Bene, è un po ‘complesso, in Java ci sono i cosiddetti caricatori di classe che sono responsabili del caricamento delle classi e della registrazione quando sorge il JVM. Se si definisce una proprietà o un metodo statico, anche questo è stato caricato, questo non avviene con variabili e metodi di istanza, poiché solo la firma è caricata.
In JavaScript non esiste nelle classi
In effetti, pensando che questo sia falso poiché in ES6 è apparso
class
, ma questo non funziona come la nuova gente pensa. Sebbene tu credi “lezioni” conclass
stai creando funzioni con il tuo rispettivo prototipo. Questa è solo la sintassi, non ha alcun impatto.Tuttavia, è possibile emulare variabili e metodi statici ** tramite
Object.defineProperty
:function User () { }Object.defineProperty(User, 'age', { enumerable: true, configurable: true, writable: true, value: 23});Object.defineProperty(User, 'getInfo', { enumerable: true, configurable: true, writable: true, value: function () { return 'Hola, tengo ' + User.age + ' años'; }});console.log(User.getInfo());
Come puoi vedere, ora
age
egetInfo
sono aderito alla funzioneUser
.sarebbe la cosa più vicina a Java , ¿VERO? Non ho bisogno di creare un’istanza e il metodo non sarebbe inalato, giusto?
Cosa fai è chiamato Funzione di fabbrica ed è carina per creare Gli oggetti hanno proprietà private e utilizzare l’aggregazione anziché l’ereditarietà. Ma in realtà, non c’è molta differenza, la differenza è quella utilizzata una funzione costruttore (
new
) Aggiungi un contesto (this
) a L’istanza, fuori di ciò, entrambi stanno creando oggetti.function CreateBall (props) { let stub = { color, weight } = props; return { color: stub.color, weight: stub.weight, changeColor (color) { stub.color = color; }, changeWeight (weight) { stub.weight = weight; }, info () { console.log(stub.color, stub.weight); } };}const myBall = new CreateBall({ color: 'blue', weight: 5});// encapsulamientomyBall.color = 'red';myBall.weight = 7;myBall.info();myBall.changeColor('red');myBall.changeWeight(7);myBall.info();
Una parte se fossi interessato a che un metodo o una variabile non potesse essere sovrascritti, senza influire su altre variabili e metodi, utilizzato per utilizzare
Object.defineProperty
per effettuare variabili e metodi statici che non possono essere sovraccaricati senza dover usareObject.freeze
,Object.seal
o ?Il vantaggio di
Object.defineProperty
è che ti dà più flessibilità: puoi farlo readonly, non renderlo enumerabile, ecc. D’altra parte,Object.freeze
Impedisci di aggiungere nuove proprietà a un oggetto, eliminare o modificare quelli esistenti. È come se metti un lucchetto; Utile nei casi in cui non si desidera modificare un oggetto, ad esempio, per sicurezza, ecc.Il metodo
Object.seal
crea qualcosa di simile: evitare di aggiungere Nuove proprietà e che si modifica la configurazione di quelli esistenti, ma le proprietà possono essere modificate.Il metodo
Object.preventExtensions
impedisce nuove proprietà come loro, ma essere aggiunte proprietà direttamente nel tuo prototipo.