Javascript The Good Parts - Capítulo 5 Herança - Prototypal

Prototypal

by Angelo Rogério Rubin

HTML

<h1>Prototípica</h1>
<p>
Em um padrão puramente protótipico, nós dispensamos classes. Nós nos concentramos sobre os objetos. Herança de protótipo é conceitualmente mais simples do que a herança clássica: um novo objeto pode herdar as propriedades de um velho objeto. Esta seja, talvez desconhecida, mas é muito fácil de entender. Você começa fazendo um objeto útil.
</p>
<p>
Você pode então fazer muitos mais objetos que são como esse. O processo de classificação de quebrar um aplicativo em um conjunto de classes abstratas aninhadas pode ser totalmente evitado. Vamos começar usando um objeto literal para fazer um objeto útil:
</p>
<pre>
var myMammal = {
    name : 'Herb the Mammal',
    get_name : function ( ) {
        return this.name;
    },
    says : function ( ) {
        return this.saying || '';
    }
};
</pre>
<p>
    Uma vez que temos um objeto que nós gostamos, podemos fazer mais instâncias com o método Object.create do Capítulo 3. Nós podemos personalizar as novas instâncias:
</p>
<pre>
var myCat = Object.create(myMammal);
myCat.name = 'Henrietta';
myCat.saying = 'meow';
myCat.purr = function (n) {
    var i, s = '';
    for (i = 0; i < n; i += 1) {
        if (s) {
            s += '-';
        }
        s += 'r';
    }
    return s;
};
myCat.get_name = function ( ) {
    return this.says( ) + ' ' + this.name + ' ' + this.says( );
};
</pre>
<p>
    Esta é a herança diferencial. Ao personalizar um novo objeto, especificamos as diferenças em relação ao objeto sobre o qual se baseia.
</p>
<p>
Às vezes é útil para estruturas de dados herdar de outras estruturas de dados. Aqui está um exemplo: Suponha que estamos analisando uma linguagem como JavaScript ou TEX em que um par de chaves indica um escopo. Itens definidos em um escopo da aplicação não são visíveis fora dele.
</p>
<p>
Em certo sentido, um âmbito interno herda de seu escopo externo. Objetos JavaScript são muito bons no que representa essa relação. A função block é chamada quando uma chave a esquerda...

CSS

body {
    font-size: 1em;
    font-family: Verdana;
}
pre {
    background-color: #CCC;
}

JavaScript

var myMammal = {
    name : 'Herb the Mammal',
    get_name : function ( ) {
        return this.name;
    },
    says : function ( ) {
        return this.saying || '';    
    }
};

var myCat = Object.create(myMammal);
myCat.name = 'Henrietta';
myCat.saying = 'meow';
myCat.purr = function (n) {
    var i, s = '';
    for (i = 0; i < n; i += 1) {
        if (s) {
            s += '-';
        }
        s += 'r';
    }
    return s;
};

myCat.get_name = function ( ) {
    return this.says( ) + ' ' + this.name + ' ' + this.says( );
};

console.log(myMammal.get_name());