2012-01-30 11 views
6

Tome un vistazo al código siguiente:Herencia JavaScript: ¿Cuándo están mis miembros derivados?

function Primate() { 
    this.prototype = Object; 
    this.prototype.hairy = true; 
} 

function Human() { 
    this.prototype = Primate; 
} 

new Human(); 

Al inspeccionar new Human(), no hay hairy miembro. Yo esperaría que haya uno. ¿Hay alguna otra forma que deba heredar de Primate? Algo relacionado con Object.create() (ECMAScript5 está bien para usar en mi escenario)?

+0

Debe leer esta herencia de entender en JS: http://javascript.crockford.com/inheritance.html y http://javascript.crockford.com/prototypal.html – bfavaretto

+1

Lo estás haciendo mal. Desea manipular los objetos 'prototype' de los constructores:' Primado' y 'Humano'. La instancia recién creada (el valor 'this' dentro del constructor) es * no * una función y, por lo tanto, agregar una propiedad' prototype' no tiene sentido. –

+0

Crearía y extendería objetos (con Object.create) en lugar de parchear mono en la cadena del prototipo. El uso de funciones como constructores puede generar confusión porque esto es implementar objetos de JavaScript como estructuras de clase. – rxgx

Respuesta

4

A medida que se escribe su código, los objetos creados usando new Human() tendrán una propiedad llamada prototype cuyo valor es una referencia a la función Primate. Claramente, eso no es lo que quieres (y no es particularmente especial).

algunas cosas:

  • normalmente se desea modificar el prototype de una funciónque está destinado a ser utilizado como un constructor (con el operador new). En otras palabras, desea establecer el prototype en Human (no en una instancia de Human).

  • El valor que se asigna al prototype debe ser un ejemplo del tipo deseado (o, si no hay trabajo de inicialización es necesario, el tipo deseado de prototype), no una referencia a su constructor.

  • Nunca es necesario asignar explícitamente Object (o Object instancias) a una función de prototype. Esto es implícito

es probable que desee algo más parecido a esto:

function Primate() { 
    this.hairy = true; 
} 

function Human() {} 
Human.prototype = new Primate(); 
Human.prototype.constructor = Human; 

var h = new Human(); 

El Human referenciado por h tiene una propiedad llamada hairy cuyo valor es cierto.

En el ejemplo anterior, hairy su valor se asigna una sola vez Primate se invoca, por lo que Human.prototype debe asignar una instancia de Primate. Esto podría escribirse en lugar de que no sea necesaria dicha inicialización.

Ejemplo:

function Primate() {} 
Primate.prototype.hairy = true; 

function Human() {} 
Human.prototype = Primate.prototype; 
Human.prototype.constructor = Human; 

var h = new Human();