Protótipos

Digite o texto aqui...

JavaScript básica 6.1.3 Protótipos Antes de podermos abordar a terceira técnica de criação de objeto, devemos fazer uma breve pausa para explicar os protótipos. Todo objeto JavaScript tem um segundo objeto JavaScript (ou null, mas isso é raro) associado. Esse segundo objeto é conhecido como protótipo e o primeiro objeto herda propriedades do protótipo.Todos os objetos criados por objetos literais têm o mesmo objeto protótipo e podemos nos referir a esse objeto protótipo em código JavaScript como Object.prototype. Os objetos criados com a palavra-chave new e uma chamada de construtora utilizam o valor da propriedade prototype da fun-ção construtora como protótipo. Assim, o objeto criado por new Object() herda de Object.prototype, exatamente como acontece com o objeto criado por {}. Da mesma forma, o objeto criado por new Array() usa Array.prototype como protótipo e o objeto criado por new Date() usa Date.prototype como protótipo.Object.prototype é um dos raros objetos que não têm protótipo: ele não herda propriedade alguma. Outros objetos protótipos são objetos normais que têm protótipo. Todas as construtoras internas (e a maioria das construtoras definidas pelo usuário) têm um protótipo que herda de Object.prototype. Por exemplo, Date.prototype herda propriedades de Object.prototype; portanto, um objeto Date criado por new Date() herda propriedades de Date.prototype e de Object.prototype. Essa série enca-deada de objetos protótipos é conhecida como encadeamento de protótipos.Uma explicação sobre o funcionamento da herança de propriedades aparece na Seção 6.2.2. Vamos aprender a consultar o protótipo de um objeto na Seção 6.8.1. E o Capítulo 9 explica a conexão entre protótipos e construtoras com mais detalhes: ele mostra como se define novas "classes" de ob-jetos escrevendo uma função construtora e configurando sua propriedade prototype com o objeto protótipo a ser utilizado pelas "instâncias" criadas com essa construtora.6.1.4 Object.create() ECMAScript 5 define um método, Object.create(), que cria um novo objeto, usando seu primeiro argumento como protótipo desse objeto. Object.create() também recebe um segundo argumento opcional que descreve as propriedades do novo objeto. Esse segundo argumento é abordado na Seção 6.7.Object.create() é uma função estática e não um método chamado em objetos individuais. Para usá--la, basta passar o objeto protótipo desejado:var o1 = Object.create({x:1, y:2}); // o1 herda as propriedades x e y.Pode-se passar null para criar um novo objeto que não tem protótipo, mas se você fizer isso, o objeto recém-criado não vai herdar nada, nem mesmo métodos básicos, como toString() (isso significa que também não funcionaria com o operador +):var o2 = Object.create(null); // o2 não herda propriedades nem métodos

Se quiser criar um objeto vazio normal (como o objeto retornado por {} ou por new Object()), passe Object.prototype:

var o3 = Object.create(Object.prototype); // o3 é como {} ou new Object().

A capacidade de criar um novo objeto com um protótipo arbitrário (falando de outro modo: a capaci-dade de criar um "herdeiro" para qualquer objeto) é poderosa e podemos simulá-la em ECMAScript 3 com uma função como a do Exemplo 6-11.Exemplo 6-1 Criando um novo objeto que herda de um protótipo // inherit() retorna um objeto recém-criado que herda propriedades do // objeto protótipo p. Ele usa a função ECMAScript 5 Object.create() se // estiver definida e, caso contrário, retrocede para uma técnica mais antiga.function inherit(p) { if (p == null) throw TypeError(); // p deve ser um objeto não null if (Object.create) // Se Object.create() está definida... return Object.create(p); // então basta usá-la. var t = typeof p; // Caso contrário, faz mais alguma verificação de // tipo if (t !== "object" && t !== "function") throw TypeError(); function f() {}; // Define uma função construtora fictícia. f.prototype = p; // Configura sua propriedade prototype como p. return new f(); // Usa f() para criar um "herdeiro" de p.} O código da função inherit() vai fazer mais sentido depois que abordarmos as construtoras, no Capítulo 9. Por enquanto, apenas aceite que ela retorna um novo objeto que herda as propriedades do objeto argumento. Note que inherit() não substitui Object.create() totalmente: ela não permite a criação de objetos com protótipos null e não aceita o segundo argumento opcional que Object.create() aceita. Contudo, vamos usar inherit() em vários exemplos neste capítulo e novamente no Capítulo 9.Um uso de nossa função inherit() é quando você quer se precaver contra a modificação não inten-cional (mas não mal-intencionada) de um objeto por uma função de biblioteca sobre a qual não tem controle. Em vez de passar o objeto diretamente para a função, você pode passar um herdeiro. Se a função lê as propriedades do herdeiro, vai ver os valores herdados. No entanto, se ela configura propriedades, essas propriedades só vão afetar o herdeiro e não seu objeto original:var o = { x: "don't change this value" };library_function(inherit(o)); // Precavê contra modificações acidentais de o Para entender por que isso funciona, você precisa saber como as propriedades são consultadas e con-figuradas em JavaScript. Esses são os temas da próxima seção.1 Douglas Crockford é geralmente considerado o primeiro a propor uma função que cria objetos dessa maneira. Consulte https://javascript.crockford.com/prototypal.html.
JavaScript

Fontes variadas e extraìdo do livro: O Guia Definitivo JavaScript  David Flanagan editora OREILI

Apenas partes *** 
Adiquira o Livro
Desenvolvido por Webnode Cookies
Crie seu site grátis! Este site foi criado com Webnode. Crie um grátis para você também! Comece agora