Métodos e variables estáticas en JavaScript ES5 (sen usar “clase”) sen obxectos instantáneos?


Eu quería replicar máis ou menos unha variable ou método estático de Java

Non intente programar nunha lingua coma se fose outro, en vez diso, saber como funciona a nova lingua e continúa a túa liña. Por que quere usar JavaScript para parecer Java? Non o fagas.

O concepto de propiedade ou método estático en Java significa que tal propiedade ou método non depende dunha instancia, se non, da mesma clase. Que entendes sobre isto? Ben, é un pouco complexo, en Java hai os chamados cargadores de clase que son responsables de cargar as clases e rexistrarse cando o JVM sobe. Se define unha propiedade estática ou método, isto tamén está cargado, isto non ocorre con variables e métodos de instancia, xa que só a súa sinatura está cargada.

En JavaScript non existe en clases

De feito, pensando que isto é falso xa que en ES6 apareceu class, pero isto non funciona como a xente nova pensa. Aínda que cres que “clases” con class está a crear funcións co seu respectivo prototipo. Esta é só a sintaxe, non ten ningún impacto.

Con todo, pode emular variables e métodos estáticos ** a través de 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());

Como podes ver, agora age e getInfo están adheridos á función User.

sería a cousa máis próxima a Java , ¿Verdade? Non teño que crear unha instancia e que o método non sería inhalado, non?

O que fai chámase función de fábrica e é bastante usado para crear Os obxectos teñen propiedades privadas e utilizan a agregación en vez de herdanza. Pero, en realidade, non hai moita diferenza, a diferenza é que usou unha función de constructor (new) engade un contexto (this) a A instancia, fóra diso, ambos están creando obxectos.

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();

Unha parte Se eu estaba interesado en que un método ou variable non podería ser substituído, sen afectar a outras variables e métodos, usados para usar Object.defineProperty para facer variables e métodos estáticos que non se puideron sobrecargar sen ter que usar Object.freeze, Object.seal ou ?

A vantaxe de Object.defineProperty é que lle dá máis flexibilidade: pode facelo lido, non faino enumerable, etc. Doutra banda, Object.freeze impedir que engada novas propiedades a un obxecto, borrar ou editar os existentes. É coma se coloque un candado; Útil nos casos en que non queres editar un obxecto, por exemplo, por seguridade, etc.

O método fai algo similar: impedir que engada novas propiedades e que cambias a configuración dos existentes, pero as propiedades pódense cambiar.

O método Object.preventExtensions evita novas propiedades como propias, pero pode engadir propiedades directamente no seu prototipo.

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *