É possível simular uma classe base abstrata em JavaScript? Qual é a maneira mais elegante de fazer isso?
Diga, eu quero fazer algo como: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
A saída deve ser: 'bark', 'meow'
javascript
oop
abstract
Sabya
fonte
fonte
Respostas:
Uma maneira simples de criar uma classe abstrata é esta:
A
Animal
"classe" e osay
método são abstratos.Criar uma instância geraria um erro:
É assim que você "herda" dele:
Dog
se parece com isso.E é assim que seu cenário se desenrola:
Fiddle aqui (veja a saída do console).
fonte
Classes e herança de JavaScript (ES6)
De acordo com o ES6, você pode usar classes e herança JavaScript para realizar o que precisa.
Referência: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
Em primeiro lugar, definimos nossa classe abstrata. Esta classe não pode ser instanciada, mas pode ser estendida. Também podemos definir funções que devem ser implementadas em todas as classes que estendem esta.
Depois disso, podemos criar nossas Classes concretas. Essas classes herdarão todas as funções e comportamentos da classe abstrata.
E os resultados ...
fonte
Você quer dizer algo assim:
fonte
whattosay
não está definido em animal ), e que essa resposta pergunta claramente se a resposta proposta era a que o questionador estava procurando. Ele não pretende fornecer uma solução para classes abstratas em javascript. O questionador não se preocupou em responder a mim ou a qualquer outra pessoa, então não tenho ideia se funcionou para ele. Lamento se uma criança de cinco anos sugeriu uma resposta para a pergunta de outra pessoa não funcionou para você.Você pode querer verificar a classe base de Dean Edwards: http://dean.edwards.name/weblog/2006/03/base/
Como alternativa, há este exemplo / artigo de Douglas Crockford sobre herança clássica em JavaScript: http://www.crockford.com/javascript/inheritance.html
fonte
Certamente. Existem cerca de mil maneiras de implementar sistemas de classe / instância em JavaScript. Aqui está um:
Essa não é realmente uma classe base abstrata, é claro. Você quer dizer algo como:
fonte
fonte
Não é garantido que funcione, pois
__proto__
não é uma variável padrão, mas funciona pelo menos no Firefox e Safari.Se você não entende como funciona, leia sobre a cadeia de protótipos.
fonte
setPrototypeOf
método que eu precise para meu código.Você pode criar classes abstratas usando protótipos de objeto, um exemplo simples pode ser o seguinte:
Você pode mudar o método acima ou não, depende de você quando você o implementa. Para uma observação detalhada, você pode querer visitar aqui .
fonte
A questão é bastante antiga, mas criei alguma solução possível como criar "classe" abstrata e bloquear a criação de objeto desse tipo.
Como você pode ver, o último objeto nos dá erro, é porque Animal no protótipo tem propriedade
abstract
. Para ter certeza de que é Animal, não algo que tenhaAnimal.prototype
na cadeia de protótipo que eu faço:Então, eu verifico se meu objeto de protótipo mais próximo tem
abstract
propriedade, apenas o objeto criado diretamente doAnimal
protótipo terá essa condição como verdadeira. A funçãohasOwnProperty
verifica apenas as propriedades do objeto atual, não seus protótipos, então isso nos dá 100% de certeza de que a propriedade é declarada aqui e não na cadeia de protótipos.Na minha proposição não temos que mudar
constructor
todas as vezes depoisObject.create
como está na melhor resposta atual do @Jordão.A solução também permite criar muitas classes abstratas na hierarquia, precisamos apenas criar
abstract
propriedades no protótipo.fonte
Outra coisa que você pode querer impor é garantir que sua classe abstrata não seja instanciada. Você pode fazer isso definindo uma função que atua como FLAG definida como o construtor da classe Abstract. Isso tentará construir o FLAG que chamará seu construtor contendo a exceção a ser lançada. Exemplo abaixo:
fonte
Javascript pode ter herança, verifique o URL abaixo:
http://www.webreference.com/js/column79/
Andrew
fonte
Podemos usar o
Factory
padrão de design neste caso. Javascript usaprototype
para herdar os membros do pai.Defina o construtor da classe pai.
E então crie classes para crianças.
Em seguida, defina o construtor da classe filha.
Teste-o.
Aqui está o link Codepen para o exemplo completo de codificação.
fonte
fonte
Acho que todas essas respostas, especialmente as duas primeiras (por alguns e jordão ) respondem à pergunta claramente com o conceito convencional de base de protótipo JS.
Agora, como você deseja que o construtor da classe animal se comporte de acordo com o parâmetro passado para a construção, acho que isso é muito semelhante ao comportamento básico de,
Creational Patterns
por exemplo, Factory Pattern .Aqui, fiz uma pequena abordagem para que funcionasse dessa forma.
fonte
Animal
construtor pode ser visto como um antipadrão, uma superclasse não deveria ter conhecimento sobre subclasses. (viola o princípio de Liskov e Abrir / Fechar)fonte
Se você deseja ter certeza de que suas classes base e seus membros são estritamente abstratos, aqui está uma classe base que faz isso para você:
O modo estrito torna impossível registrar o chamador no método throwAbstract, mas o erro deve ocorrer em um ambiente de depuração que mostre o rastreamento da pilha.
fonte