Eu tenho programado com linguagens OOP por mais de 10 anos, mas estou aprendendo JavaScript agora e é a primeira vez que encontro herança baseada em protótipo. Eu tendo a aprender mais rápido estudando um bom código. Qual é um exemplo bem escrito de um aplicativo (ou biblioteca) JavaScript que usa apropriadamente a herança prototípica? E você pode descrever (brevemente) como / onde a herança prototípica é usada, para que eu saiba por onde começar a ler?
javascript
prototypal-inheritance
Alex Reisner
fonte
fonte
Respostas:
Douglas Crockford tem uma boa página sobre herança de protótipo de JavaScript :
Dean Edward's Base.js , Mootools's Class ou John Resig's Simple Inheritance são maneiras de fazer herança clássica em JavaScript.
fonte
newObj = Object.create(oldObj);
se você quiser sem aulas? Caso contrário, substituir comoldObj
pelo objeto de protótipo da função do construtor deve funcionar?Conforme mencionado, os filmes de Douglas Crockford dão uma boa explicação sobre o porquê e cobre o como. Mas, para colocá-lo em algumas linhas de JavaScript:
O problema com essa abordagem, entretanto, é que ela recriará o objeto sempre que você criar um. Outra abordagem é declarar seus objetos na pilha de protótipo, assim:
Existe uma pequena desvantagem quando se trata de introspecção. O despejo do testOne resultará em informações menos úteis. Além disso, a propriedade privada "privateVariable" em "testOne" é compartilhada em todas as instâncias, também mencionada de maneira útil nas respostas de shesek.
fonte
privateVariable
é simplesmente uma variável no escopo do IIFE e é compartilhada por todas as instâncias, portanto, você não deve armazenar dados específicos da instância nela. (no testTwo é específico da instância, já que cada chamada para testTwo () cria um novo escopo por instância)Dog.prototype
. Portanto, em vez de usarthis.bark = function () {...}
, podemos fazerDot.prototype.bark = function () {...}
fora daDog
função. (Veja mais detalhes nesta resposta )fonte
Eu daria uma olhada na YUI e na
Base
biblioteca de Dean Edward : http://dean.edwards.name/weblog/2006/03/base/Para YUI, você pode dar uma olhada rápida no módulo lang , esp. o método YAHOO.lang.extend . E então, você pode navegar pela fonte de alguns widgets ou utilitários e ver como eles usam esse método.
fonte
lang
está parcialmente quebrado. Alguém se preocupa em consertá-lo para YUI 3?Há também a biblioteca ASP.NET Ajax da Microsoft , http://www.asp.net/ajax/ .
Também existem muitos artigos bons no MSDN, incluindo Criar aplicativos da Web avançados com técnicas orientadas a objetos .
fonte
Este é o exemplo mais claro que encontrei, do livro Mixu's Node ( http://book.mixu.net/node/ch6.html ):
fonte
ES6
class
eextends
ES6
class
eextends
são apenas açúcar de sintaxe para manipulação de cadeia de protótipo anteriormente possível e, portanto, sem dúvida a configuração mais canônica.Primeiro, aprenda mais sobre a cadeia de protótipo e
.
pesquisa de propriedade em: https://stackoverflow.com/a/23877420/895245Agora vamos desconstruir o que acontece:
Diagrama simplificado sem todos os objetos predefinidos:
fonte
Eu sugiro olhar para PrototypeJS 'Class.create:
Line 83 @ http://prototypejs.org/assets/2009/8/31/prototype.js
fonte
Os melhores exemplos que vi estão em JavaScript: The Good Parts de Douglas Crockford . Definitivamente, vale a pena comprar para ajudá-lo a ter uma visão equilibrada do idioma.
Douglas Crockford é responsável pelo formato JSON e trabalha no Yahoo como um guru do JavaScript.
fonte
Há um fragmento de herança baseada em protótipo de JavaScript com implementações específicas de versão ECMAScript. Ele escolherá automaticamente qual usar entre as implementações ES6, ES5 e ES3 de acordo com o tempo de execução atual.
fonte
Adicionando um exemplo de herança baseada em protótipo em Javascript.
ES6 usa uma implementação muito mais fácil de herança com o uso de construtor e super palavras-chave.
fonte