Eu queria replicar mais ou menos um método variável ou estático de java
Não tente programar em um idioma como se fosse outro, em vez disso, saiba como o novo idioma funciona e continua sua linha. Por que você quer usar o Javascript para se parecer com Java? Apenas não faça isso.
O conceito de propriedade ou método estático em Java significa que essa propriedade ou método não depende de uma instância, se não, da mesma classe. O que você entende sobre isso? Bem, é um pouco complexo, em Java existem os chamados carregadores de classe que são responsáveis por carregar as aulas e se registrar quando a JVM sobe. Se você definir uma propriedade ou método estático, isso também será carregado, isso não acontecerá com variáveis e métodos de instância, já que apenas sua assinatura é carregada.
Em javascript não existe nas aulas
Na verdade, pensando que isso é falso desde o ES6 apareceu
class
, mas isso não funciona como as novas pessoas pensam. Embora você acredite “classes” comclass
Você está criando funções com o respectivo protótipo. Esta é apenas sintaxe, não tem impacto.No entanto, você pode emular variáveis e métodos estáticos ** via
Object.defineProperty
Como você pode ver, agora age
e getInfo
são aderidos à função User
seria a coisa mais próxima de Java ¿TRUE? Eu não preciso criar uma instância e o método não seria inalado, certo?
O que você faz é chamado de função de fábrica e é muito usado para criar Objetos têm propriedades privadas e usar agregação em vez de herança. Mas, na realidade, não há muita diferença, a diferença é que usou uma função de construtor (
new
) Adicione um contexto (this
) para A instância, ambos, ambos estão criando objetos.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();
uma parte se eu estivesse interessado que um método ou variável não pudesse ser sobrescrito, sem afetar outras variáveis e métodos, usados para usar
Object.defineProperty
para fazer variáveis e métodos estáticos que não puderam ser sobrecarregados sem ter que usarObject.freeze
,Object.seal
ou ?a vantagem de
Object.defineProperty
é que lhe dá mais flexibilidade: você pode fazer isso readonly, não torná-lo enumerável, etc. Por outro lado,Object.freeze
Impede adicionar novas propriedades a um objeto, excluir ou editar as existentes. É como se você colocasse um cadeado; Útil nos casos em que você não deseja editar um objeto, por exemplo, para segurança, etc.o método
Object.seal
faz algo semelhante: impedir que você adicione Novas propriedades e que você altera a configuração dos existentes, mas as propriedades podem ser alteradas.O método
Object.preventExtensions
impede novas propriedades como as suas próprias, mas ser adicionados propriedades diretamente no seu protótipo.