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

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

by Angelo Rogério Rubin

HTML

<h1>Pseudoclassico</h1>
<p>
    JavaScript está em conflito sobre sua natureza prototípica. Seu mecanismo prototípico é obscurecido por algumas regras sintáticas complicadas que parecem vagamente clássicas.
Ao invés de objetos herdarem diretamente de outros objetos, um nível desnecessário de engano é inserido de modo que os objetos são produzidos por funções construtoras.
</p>
<p>
    Quando um objeto de função é criado, o construtor <em>Function</em> que produz o objeto de função utiliza algum código como este:
</p>
<pre>
    this.prototype = {
        constructor: this
    };
</pre>
<p>
    Ao novo objeto de função é dada uma propriedade <em>prototype</em> cujo valor é um objeto contendo uma propriedade <em>Constructor</em> cujo valor é o novo objeto de função. O objeto de protótipo é o lugar onde traços herdados estão a ser depositados.
</p>
<p>
    Cada função recebe um objeto de protótipo, porque a linguagem não fornece uma maneira de determinar quais funções destinam-se a ser usadas como construtores. A propriedade <em>constructor</em> não é útil. É o objecto protótipo que é importante.
</p>
<p>
    Quando uma função é chamada com o padrão de chamada do construtor usando o operador <em>new</em>, este modifica o modo em que a função é executada. Se o operador <em>new</em> fosse um método, em vez de um operador, poderia ter sido implementado assim: 
</p>
<pre>
Function.method('new', function ( ) {
    // Create a new object that inherits from the
    // constructor's prototype.
    var that = Object.create(this.prototype);
    // Invoke the constructor, binding –this- to
    // the new object.
    var other = this.apply(that, arguments);
    // If its return value isn't an object,
    // substitute the new object.
    return (typeof other === 'object' && other) || that;
});
</pre>
<p>
    Podemos definir um construtor e aumentar este protótipo:
</p>
<pre>
var Mammal = function (name) {
    this.name = name;
};
Mammal.prototype.get_name = function ( ) {
   ...

CSS

body {
    font-family: Verdana;
    font-size: 0.9em;
}