As classes / objetos JavaScript podem ter construtores? Como eles são criados?
javascript
oop
Click Voto a favor
fonte
fonte
Respostas:
Usando protótipos:
Ocultação de "cor" (lembra um pouco uma variável de membro particular):
Uso:
fonte
color
. Eu sugiro que você usa é em grande parte uma questão de preferência pessoal (protecção contra simplicidade)var
faz uma variável privada.this
faz uma variável públicaFoo
, enquanto no último caso ele saberá que estáFoo
sendo chamado. Muito útil para depuração.Aqui está um modelo que às vezes uso para comportamentos semelhantes a OOP em JavaScript. Como você pode ver, você pode simular membros privados (estáticos e de instância) usando fechamentos. O
new MyClass()
que retornará é um objeto com apenas as propriedades atribuídas aothis
objeto e noprototype
objeto da "classe".Fui questionado sobre herança usando esse padrão, então aqui vai:
E um exemplo para usar tudo:
Como você pode ver, as classes interagem corretamente umas com as outras (elas compartilham o ID estático
MyClass
, oannounce
método usa oget_name
método correto etc.)Uma coisa a observar é a necessidade de sombrear as propriedades da instância. Na verdade, você pode fazer a
inherit
função passar por todas as propriedades da instância (usandohasOwnProperty
) que são funções e adicionar automaticamente umasuper_<method name>
propriedade. Isso permitiria que você chamasse emthis.super_get_name()
vez de armazená-lo em um valor temporário e chamá-lo vinculado usandocall
.Para métodos no protótipo, você não precisa se preocupar com o exposto acima. Se você quiser acessar os métodos de protótipo da superclasse, basta ligar
this.constructor.super.prototype.methodName
. Se você quiser torná-lo menos detalhado, é claro que pode adicionar propriedades de conveniência. :)fonte
cls.prototype
parte: "compartilhado entre instâncias" é apenas para ler o valor (chamandoannounce
). Se você definirmyClassInstance.announce
outro valor, ele criará uma nova propriedade emmyClassInstance
, portanto, somente se aplicará a esse objeto, não a outras instâncias da classe. Atribuir aMyClass.prototype.announce
afetará todas as instâncias.MyClass.get_nextId()
Parece-me que muitos de vocês estão dando exemplos de getters e setters, não um construtor, ou seja, http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming) .
O lunch-dan estava mais próximo, mas o exemplo não funcionou no jsFiddle.
Este exemplo cria uma função de construtor particular que é executada apenas durante a criação do objeto.
Se você deseja atribuir propriedades públicas, o construtor pode ser definido como tal:
fonte
Box()
função :). Mas este exemplo, bem como exemplos nas outras respostas, podem ser facilmente estendidos para aceitar parâmetros.Box
função e você estará pronto (ainda é "privado"). "Privado" em Javascript significa apenas acessível via escopo lexical; não há necessidade de atribuir aos membros. Além disso: esse código está errado. Ele cria uma__construct
variável global , o que é bastante ruim.var
deve ser usado para restringir o escopo de__construct
.O objetivo da propriedade construtor é fornecer uma maneira de fingir que o JavaScript tem classes. Uma das coisas que você não pode fazer com utilidade é alterar o construtor de um objeto depois que ele é criado. É complicado.
Eu escrevi uma peça bastante abrangente sobre isso há alguns anos: http://joost.zeekat.nl/constructors-considered-mildly-confusing.html
fonte
Exemplo aqui: http://jsfiddle.net/FZ5nC/
Experimente este modelo:
Você deve ajustar seu espaço para nome se estiver definindo uma classe estática:
Classe de exemplo:
Instanciação de exemplo:
As funções de aviso são definidas como AB = função A_B (). Isso é para facilitar a depuração do seu script. Abra o painel Inspect Element do Chrome, execute este script e expanda o backtrace de depuração:
fonte
Este é um construtor:
Quando você faz
MyClass
é executado e um novo objeto é retornado dessa classe.fonte
alert(valuePassedInAsArgument);
e isso será executado uma vez a cada instanciação, portanto, toda a classe é o próprio construtor.new object is returned of that class
- não é mais como um novo objeto é retornado dessa função?Achei este tutorial muito útil. Essa abordagem é usada pela maioria dos plug-ins do jQuery.
http://www.htmlgoodies.com/html5/tutorials/create-an-object-oriented-javascript-class-constructor.html#fbid=OVYAQL_TDpK
Agora ,
fonte
klass
Esse padrão me serviu bem. Com esse padrão, você cria classes em arquivos separados, carrega-as no seu aplicativo geral "conforme necessário".
fonte
var
no construtor (ou argumento da função ou em uma função semelhante ao construtor).Sim, você pode definir um construtor dentro de uma declaração de classe como esta:
fonte
Acho que vou postar o que faço com o fechamento de javascript, pois ninguém está usando o fechamento ainda.
Comentários e sugestões para esta solução são bem-vindos. :)
fonte
Usando a amostra de Nick acima, você pode criar um construtor para objetos sem parâmetros usando uma instrução de retorno como a última instrução na sua definição de objeto. Retorne sua função de construtor conforme abaixo e ele executará o código em __construct toda vez que você criar o objeto:
fonte
this.getColor();
na linha acima,alert("Object Created.");
nada será alertado. Ocorrerá um erro como "getColor não está definido". Se você deseja que a construção possa chamar outros métodos no objeto, ela precisa ser definida após todos os outros métodos. Então, ao invés de chamar__construct();
a última linha, apenas defina a construção lá embaixo e coloque-a()
depois para forçá-la a executar automaticamente.()
ao final da definição de construção ainda resultou no erro. Eu tive que chamar__construct();
em sua própria linha, como no código original, para evitar o erro.Talvez tenha ficado um pouco mais simples, mas abaixo está o que eu criei agora em 2017:
Ao usar a classe acima, tenho o seguinte:
Como você pode ver, o construtor utiliza dois parâmetros e definimos as propriedades do objeto. Também alteramos a cor e a forma do objeto usando as
setter
funções e provamos que sua alteração permaneceu após a chamadagetInfo()
após essas alterações.Um pouco tarde, mas espero que isso ajude. Eu testei isso com um
mocha
teste de unidade e está funcionando bem.fonte
Eles fazem se você usar o Typescript - código aberto da MicroSoft :-)
O TypeScript permite que você construa construções OO falsas que são compiladas em construções javascript. Se você estiver iniciando um projeto grande, poderá economizar muito tempo e atingir a versão 1.0 do marco.
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf
O código acima é 'compilado' para:
fonte
No JavaScript, o tipo de chamada define o comportamento da função:
func()
obj.func()
new func()
func.call()
oufunc.apply()
A função é chamada como um construtor ao chamar usando o
new
operador:Qualquer objeto de instância ou protótipo em JavaScript tem uma propriedade
constructor
, que se refere à função do construtor.Verifique esta postagem sobre a propriedade do construtor.
fonte
Ao usar o ótimo modelo de Blixt acima, descobri que ele não funciona bem com herança de vários níveis (MyGrandChildClass estendendo MyChildClass estendendo MyClass) - ele liga para chamar o construtor do primeiro pai repetidamente. Então, aqui está uma solução simples - se você precisar de herança em vários níveis, em vez de usar o
this.constructor.super.call(this, surName);
usochainSuper(this).call(this, surName);
com a função de cadeia definida assim:fonte
http://www.jsoops.net/ é muito bom para oop em Js. Se fornecer variável e função pública, protegida e pública, e também recurso de Herança. Código de exemplo:
fonte
apenas para oferecer alguma variedade. O ds.oop é uma ótima maneira de declarar classes com construtores em javascript. Ele suporta todos os tipos possíveis de herança (incluindo um tipo que até o c # não suporta), bem como interfaces, o que é bom.
fonte
Aqui, precisamos observar um ponto no script java, é uma linguagem sem classe, no entanto, podemos alcançá-lo usando funções no script java. A maneira mais comum de conseguir isso é criar uma função no script java e usar a nova palavra - chave para criar um objeto e usar essa palavra - chave para definir propriedades e métodos. Abaixo está o exemplo.
fonte
Na maioria dos casos, é necessário declarar de alguma forma a propriedade necessária antes de chamar um método que transmita essas informações. Se você não precisar definir inicialmente uma propriedade, basta chamar um método dentro do objeto dessa forma. Provavelmente não é a maneira mais bonita de fazer isso, mas isso ainda funciona.
fonte