2011-09-22 3 views
0

J'ai un problème avec l'héritage de consturctor:ne peut pas hériter constructeur de la classe parent

function Alive(name) { 
    this.name = name; 
} 
var Cat = new Function(); 
Cat.prototype = new Alive(); 
Cat.prototype.constructor = Alive; 
var cat = new Cat('Thomas'); 
alert(cat.name); 

alerte show non défini. Ce que je fais mal? jsfiddle

Répondre

3

On dirait que vous voulez que le constructeur parent soit appelé automatiquement, ce qui n'est pas supporté sans travail supplémentaire. Votre code doit ressembler à ce qui suit

function Alive(name) { 
    this.name = name; 
} 

function Cat(name) { 
    // Call the parent constructor 
    Alive.call(this, name); 
} 

Cat.prototype = new Alive(); 
// This line is to fix the constructor which was 
// erroneously set to Alive in the line above 
Cat.prototype.constructor = Cat; 

var cat = new Cat('Thomas'); 
alert(cat.name); 

Si vous utilisez une bibliothèque pour mettre en œuvre l'héritage, vous ne devez pas vous inquiéter à ce sujet. Ils peuvent même appeler votre constructeur parent automatiquement si vous ne voulez pas créer un constructeur vide. Le code ci-dessus n'est toujours pas idéal. Voir un article que j'ai écrit qui parle de la «bonne» façon de faire de l'héritage. http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html

0

Parce que Cat n'accepte pas d'argument. Voici ce que vous voulez:

function Alive(name) { 
    this.name = name; 
} 


function Cat(name) { 
    Alive.call(this, name); 
} 

// since there's nothing on the prototype, this isn't necessary. 
// Cat.prototype = new Alive(); 

var cat = new Cat('Tomas'); 

alert(cat.name); 
+0

Cet exemple ne configure pas la chaîne du prototype, donc ce n'est pas l'héritage. –

+0

Comme mentionné dans les commentaires du code, il n'y a aucune raison de le configurer car il n'y a rien à hériter. Si quelque chose était défini sur le prototype, ce serait différent. – Jeremy

+0

La configuration de la chaîne du prototype est toujours nécessaire, sinon 'cat instanceof Alive' retournera false –

Questions connexes