2010-10-20 4 views
1

J'utilise la fonction suivante pour créer de nouveaux objets.Pourquoi la fonction init du prototype de cet objet ne sera-t-elle pas exécutée?

function newObj(o) { 
var params = Array.prototype.slice.call(arguments,1); 
function F() {} 
F.prototype = o; 
var obj = new F(); 
if(params.length) { 
    obj.init.apply(obj,params); 
} 
return obj; 
} 

Et cela fonctionne bien la plupart du temps. Cependant un de mes bases « classes » est désormais définie comme héritant d'une autre classe de base

SPZ.EditablePuzzle = function() { 
    // function and variable definitions 

    return { 
     ///some methods and properties 
    } 
}(); 

SPZ.EditablePuzzle.prototype = SPZ.Puzzle; 

Maintenant, quand j'utilise newobj() pour créer une nouvelle SPZ.EditablePuzzle la fonction d'initialisation n'est pas définie, même si elle est définie dans SPZ.Puzzle et moi nous assurons que EditablePuzzle fonctionne après Puzzle

Pourquoi ma fonction newObj ne trouve-t-elle pas la fonction init? Ne devrait-il pas automatiquement regarder dans le prototype dès qu'il ne parvient pas à le trouver dans l'objet lui-même?

Répondre

0

Je soupçonne que l'héritage n'est pas bien défini. essayer de faire

SPZ.EditablePuzzle.prototype = new SPZ.Puzzle; 

Pourrait résoudre ce problème, mais je ne suis pas sûr.

+0

Apparaît liek c'est tout. À votre santé – wheresrhys

0

En ce qui concerne le problème:

function Foo() { 
} 

Foo.prototype.init = function() { 
    console.log('bla'); 
}; 


function FooBar() { 
} 

FooBar.prototype = Foo; // looks fishy... 

var kitten = new FooBar(); 

console.log(kitten.init); // yields undefined, uh what? 

Le problème est que dans ce cas Foo lui-même est attribué, à la propriété prototype, alors qu'en fait, vous vouliez faire:

FooBar.prototype = Foo.prototype 

Voir la différence ? Foo n'a pas de propriété init telle qu'elle est définie sur l'objet prototype.

+0

La fonction() est là pour que la fonction soit appelée immédiatement pour renvoyer l'objet. Et dans mon cas, l'objet dont je hérite a init comme une propriété directe – wheresrhys

+0

Ah, ouais maintenant je le vois, désolé pour ce qui est encore un peu tôt le matin ici;) –

Questions connexes