Metodi e variabili statici in JavaScript ES5 (senza utilizzare “classe”) senza oggetti istantanee?


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” con class 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 e getInfo sono aderito alla funzione User.

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 usare Object.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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *