2010-04-21 11 views
10

Estoy teniendo algunos problemas para entender la cláusula si al final de esta función de Pro Patrones JavaScript Diseño extender:JavaScript herencia función

function extend(subClass, superClass) { 
    var F = function() {}; 
    F.prototype = superClass.prototype; 
    subClass.prototype = new F(); 
    subClass.prototype.constructor = subClass; 

    subClass.superclass = superClass.prototype; 
    if(superClass.prototype.constructor == Object.prototype.constructor) { 
     superClass.prototype.constructor = superClass; 
    } 
} 

El libro explica que estas líneas aseguran que el atributo constructor de la superclase es correcta establecer, incluso si la superclase es la clase de objeto en sí. Sin embargo, si omito esas tres líneas y hacer lo siguiente:

function SubClass() {}; 
extend(SubClass, Object); 

alert(Object.prototype.constructor == Object); 

La alerta dice 'verdadero', lo que significa constructor de la superclase se establece correctamente incluso sin esas tres últimas líneas. ¿Bajo qué condiciones, entonces, hace esta declaración IF hacer algo útil?

Gracias.

+0

Tengo una pregunta: ¿por qué la función de intermediario M, en lugar de sólo subClass.prototype = new superClass() ;? – 755

Respuesta

14

El problema que esas dos líneas tratan de evitar, se produce generalmente cuando se reemplaza la propiedad prototype de una función constructora, por ejemplo:

function Foo() {}; 
Foo.prototype = { 
    bar: 'baz' 
}; 

var foo = new Foo(); 
foo.constructor === Object; // true, but `constructor` should refer to Foo 

Cuando functions objects are created, la propiedad prototype se inicia con un nuevo objeto , que contiene una propiedad constructor que se refiere a la función en sí, por ejemplo:

function Bar() {}; 
var bar = new Bar(); 
bar.constructor === Bar; // true 

cada vez que cambie la propiedad con prototype otro objeto, este objeto tiene su propia propiedad constructor, generalmente heredada de otro constructor, o de Object.prototype.

var newObj = {}; 
newObj.constructor === Object; 

artículos recomendados:

+1

Eso lo aclara para mí. Gracias. La explicación de los autores para este código es engañosa. Deberían haber dicho que garantiza que la superclase no se ha extendido de forma incorrecta. – Zach