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” conclass
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
egetInfo
están adheridos á funciónUser
.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 usarObject.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.