Eu tenho tentado convencer os getters e setters e eles não estão afundando. Eu li Getters e Setters JavaScript e Definindo Getters e Setters e simplesmente não entendo .
Alguém pode afirmar claramente:
- O que um getter e um setter devem fazer, e
- Dê alguns exemplos MUITO simples?
javascript
setter
getter
Alexander Abakumov
fonte
fonte
a = setValue(5);
coma = 5;
esetValue()
seria assim chamado sob o capô para fazer o que quiser.Respostas:
Além da resposta do @ millimoose , os setters também podem ser usados para atualizar outros valores.
Agora, você pode definir
fullName
efirst
elast
será atualizado e vice-versa.fonte
Object.defineProperty
função mais recente que pode definir getters e setters.this.__defineGetter__
aObject.defineProperty
função mais recente .Name.prototype.constructor
? Parece uma péssima alternativa à resposta do millimoose .Getters e Setters em JavaScript
Visão geral
Getters e setters em JavaScript são usados para definir propriedades computadas ou acessadores . Uma propriedade computada é aquela que usa uma função para obter ou definir um valor de objeto. A teoria básica está fazendo algo assim:
Isso é útil para fazer coisas automaticamente nos bastidores quando uma propriedade é acessada, como manter números no intervalo, reformatar cadeias de caracteres, acionar eventos com valor alterado, atualizar dados relacionais, fornecer acesso a propriedades particulares e muito mais.
Os exemplos abaixo mostram a sintaxe básica, embora eles simplesmente obtenham e definam o valor interno do objeto sem fazer nada de especial. Nos casos do mundo real, você modificaria o valor de entrada e / ou saída para atender às suas necessidades, conforme observado acima.
obter / definir palavras-chave
O ECMAScript 5 suporta
get
eset
palavras - chave para definir propriedades calculadas. Eles funcionam com todos os navegadores modernos, exceto o IE 8 e abaixo.Getters e setters personalizados
get
eset
não são palavras reservadas, para que possam ser sobrecarregadas para criar suas próprias funções de propriedade computadas em vários navegadores. Isso funcionará em qualquer navegador.Ou, para uma abordagem mais compacta, uma única função pode ser usada.
Evite fazer algo assim, o que pode levar ao inchaço do código.
Para os exemplos acima, os nomes das propriedades internas são abstraídos com um sublinhado para desencorajar os usuários de simplesmente fazer
foo.bar
vs.foo.get( 'bar' )
e obter um valor "não cozido". Você pode usar código condicional para fazer coisas diferentes, dependendo do nome da propriedade que está sendo acessada (por meio doname
parâmetro).Object.defineProperty ()
Usar
Object.defineProperty()
é outra maneira de adicionar getters e setters, e pode ser usado em objetos depois de definidos. Também pode ser usado para definir comportamentos configuráveis e enumeráveis. Essa sintaxe também funciona com o IE 8, mas infelizmente apenas em objetos DOM.__defineGetter __ ()
Finalmente,
__defineGetter__()
é outra opção. Ele foi descontinuado, mas ainda é amplamente usado na Web e, portanto, é improvável que desapareça tão cedo. Ele funciona em todos os navegadores, exceto no IE 10 e abaixo. Embora as outras opções também funcionem bem em não-IE, essa não é tão útil.Também digno de nota é que, nos últimos exemplos, os nomes internos devem ser diferentes dos nomes dos acessadores para evitar recursão (ou seja,
foo.bar
chamandofoo.get(bar)
chamandofoo.bar
chamandofoo.get(bar)
...).Veja também
MDN get , set , Object.defineProperty () , __defineGetter __ () , __defineSetter __ () Suporte ao
MSDN IE8 Getter
fonte
this[ '_' + name ] = value;
poderia serthis[ '_' + name ] = arguments[1];
e não haveria necessidade de especificarvalue
arg.var foo = { bar : 123, get bar(){ return bar; }, set bar( value ){ this.bar = value; } }; foo.bar = 456;
gera uma exceção: RangeError não detectado: tamanho máximo da pilha de chamadas excedido na barra Object.set [como barra] (<anônimo>: 4: 32) na barra Object.set [como barra] (<anônimo>: 4: 32 ) na barra Object.set [como barra] (<anonymous>: 4: 32) na barra Object.set [como barra] (<anônimo>: 4: 32) na barra Object.set [como barra] (<anônimo> : 4: 32) na barra Object.set [como barra] (<anônimo>: 4: 32)bar: 123
ethis.bar = value
etc. altere-os para,_bar
por exemplo. Veja: hongkiat.com/blog/getters-setters-javascript_foo
oumFoo
. Se for o mesmo que o getter / setter, causará um loop infinito devido à recursão e, em seguida, um Stack Overflow ™ ;-) porque quando você diz a = b, chama a.get (b), que chama a = b , que chama a.get (b), ...Você os usaria, por exemplo, para implementar propriedades calculadas.
Por exemplo:
(CodePen)
fonte
Object.defineProperties
.Desculpe ressuscitar uma pergunta antiga, mas achei que poderia contribuir com alguns exemplos muito básicos e explicações para manequins. Nenhuma das outras respostas postadas até agora ilustra a sintaxe como o primeiro exemplo do guia MDN , que é o mais básico possível.
Getter:
... registrará
John Smith
, é claro. Um getter se comporta como uma propriedade de objeto variável, mas oferece a flexibilidade de uma função para calcular seu valor retornado em tempo real. É basicamente uma maneira elegante de criar uma função que não requer () ao chamar.Normatizador:
... registrará
New York
no console. Assim como os getters, os setters são chamados com a mesma sintaxe que a configuração do valor de uma propriedade de objeto, mas são outra maneira sofisticada de chamar uma função sem ().Veja este jsfiddle para um exemplo mais completo, talvez mais prático. A passagem de valores para o setter do objeto aciona a criação ou o preenchimento de outros itens do objeto. Especificamente, no exemplo jsfiddle, passar uma matriz de números solicita ao levantador que calcule média, mediana, modo e intervalo; depois define as propriedades do objeto para cada resultado.
fonte
maps.roll
como uma propriedade em vez do valormaps.roll()
de retorno. É apenas uma preferência.maps.roll()
Getters e setters realmente só fazem sentido quando você possui propriedades particulares de classes. Como o Javascript realmente não possui propriedades de classe privada, como você normalmente pensaria em Linguagens Orientadas a Objetos, pode ser difícil de entender. Aqui está um exemplo de um objeto de contador privado. O bom desse objeto é que a variável interna "count" não pode ser acessada de fora do objeto.
Se você ainda estiver confuso, dê uma olhada no artigo de Crockford sobre membros privados em Javascript .
fonte
var baz = foo.bar
ter um conjunto completo de comportamentos ocultos por trás dele. Eu iria esperar que a partirfoo.getBar()
, no entanto.Acho que o primeiro artigo ao qual você vincula afirma claramente:
O objetivo aqui é encapsular e abstrair os campos, permitindo apenas o acesso a eles através de um método
get()
ouset()
. Dessa forma, você pode armazenar internamente o campo / dados da maneira que desejar, mas os componentes externos estão fora da interface publicada. Isso permite que você faça alterações internas sem alterar as interfaces externas, faça alguma validação ou verificação de erros dentro doset()
método, etc.fonte
Embora geralmente estamos acostumados a ver objetos com propriedades públicas sem nenhum controle de acesso, o JavaScript nos permite descrever com precisão as propriedades. De fato, podemos usar descritores para controlar como uma propriedade pode ser acessada e qual lógica podemos aplicar a ela. Considere o seguinte exemplo:
O resultado final:
fonte
O que é tão confuso sobre isso ... getters são funções que são chamadas quando você obtém uma propriedade, setters, quando você a define. exemplo, se você fizer
Você está configurando a propriedade prop, se estiver usando getters / setters, a função setter será chamada, com "abc" como argumento. A definição da função setter dentro do objeto seria idealmente parecida com esta:
Não tenho certeza de quão bem isso é implementado nos navegadores. Parece que o Firefox também possui uma sintaxe alternativa, com métodos especiais com sublinhado duplo ("mágico"). Como de costume, o Internet Explorer não suporta nada disso.
fonte
Você pode definir o método de instância para a classe js, através do protótipo do construtor.
A seguir está o código de exemplo:
E, isso deve funcionar para qualquer navegador, você também pode simplesmente usar o nodejs para executar este código.
fonte
Também fiquei um pouco confuso com a explicação que li , porque estava tentando adicionar uma propriedade a um protótipo existente que não escrevi; portanto, substituir o protótipo parecia a abordagem errada. Portanto, para a posteridade, veja como adicionei uma
last
propriedade aArray
:Sempre um pouco melhor do que adicionar uma função IMHO.
fonte
Se você está se referindo ao conceito de acessadores, o objetivo simples é ocultar o armazenamento subjacente da manipulação arbitrária. O mecanismo mais extremo para isso é
Se você está se referindo ao recurso JS getter / setter real, por exemplo.
defineGetter
/defineSetter
, ou{ get Foo() { /* code */ } }
, então, vale a pena notar que, na maioria dos mecanismos modernos, o uso subsequente dessas propriedades será muito mais lento do que seria. por exemplo. comparar o desempenho devs.
fonte
Eu tenho um para vocês que pode ser um pouco feio, mas é feito em várias plataformas
Dessa forma, quando você liga
Se você realmente deseja apimentar as coisas, insira um tipo de verificação:
ou fique ainda mais louco com o código typeof check avançado: type.of () em codingforums.com
fonte