2009-10-10 3 views
0

J'écris du JavaScript avec trois classes, une pour les toits, une pour les garages et une pour les maisons. La classe de la maison prend deux arguments à son constructeur, un toit et un garage. Quand je lance ce code je reçois:Problème avec le constructeur d'objet JavaScript où les arguments sont d'autres objets

ne peut pas former l'objet [Pause sur cette erreur] throw new Error (« ne peut pas construire l'objet »); \ n

dans Firebug même si les objets sont clairement du bon type. Une idée de ce que je fais mal? Voici le code:

function Roof(type, material) { 
    this.getType = function() { return type; } 
    this.getMaterial = function() { return material; } 
} 

function Garage(numberOfCars) { 
    this.getNumberOfCars = function() { return numberOfCars; } 
} 

function House(roof, garage) { 
    if (typeof roof !== 'Roof' || typeof garage !== 'Garage') { 
      throw new Error('can not construct object'); 
    } 

    this.getRoof = function() { return roof; } 
    this.getGarage = function() { return garage; } 
} 

myRoof = new Roof("cross gabled", "wood"); 
myGarage = new Garage(3); 
myHouse = new House(myRoof, myGarage); 
alert(myHouse.getRoof().getType()); 

Répondre

1

L'opérateur typeof retournera "object" pour vos objets, pas leurs noms. Voir the typeof Operator documentation.

function House(roof, garage) { 
    alert(typeof roof); // "object" 
    ... 

Vous voulez probablement instanceof:

function House(roof, garage) { 
    if (!(roof instanceof Roof) || !(garage instanceof Garage)) { 
    ... 
+0

Vous avez raison! Alors, comment peut-on s'assurer que le bon type d'objet a été passé dans le constructeur? Je ne voudrais pas que quelqu'un passe dans un objet Foo quand j'attendais un toit ... – Ralph

1

Comme l'a noté Richie, typeof retournera 'objet', pas le nom de la fonction. Vous devez utiliser la propriété 'constructeur' . Utilisez l'opérateur 'instanceof'.

Aussi, j'ai utilisé deux 'if statements' (au lieu d'un, comme vous l'avez fait) pour lancer un message d'erreur différent en fonction de l'erreur particulière. Cela peut signifier un peu plus de code, mais quand le code se casse, vous savez exactement ce qui s'est mal passé.

Working demo →

code:

function Roof(type, material) { 
    this.getType = function() { return type; } 
    this.getMaterial = function() { return material; } 
} 

function Garage(numberOfCars) { 
    this.getNumberOfCars = function() { return numberOfCars; } 
} 

function House(roof, garage) { 
    if (roof instanceof Roof) 
    { 
     throw new Error('Argument roof is not of type Roof'); 
    } 

    if(garage instanceof Garage) 
    { 
      throw new Error('Argument garage must be of type Garage.'); 
    } 

    this.getRoof = function() { return roof; } 
    this.getGarage = function() { return garage; } 
} 

myRoof = new Roof("cross gabled", "wood"); 
myGarage = new Garage(3); 
myHouse = new House(myRoof, myGarage); 
alert(myHouse.getRoof().getType()); 
+0

Bobice, tu as raison, il vaut mieux utiliser instanceof. Corrigé la réponse Je ne devrais pas me précipiter pour répondre à une question! :) – SolutionYogi

+1

N'utilisez pas 'constructor'. Ce n'est pas standard, pas disponible dans IE, et il ne fait pas ce que vous pensez dès que vous commencez à utiliser des prototypes. Le seul moyen standard et fiable de tester l'héritage d'un objet en JavaScript est 'instanceof'. – bobince

+0

oups, anomalie temporelle! (ahem) – bobince

1

myRoof et myGarage sont object types.

Si vous voulez vérifier si myRoof est une instance de Roof, utilisez isinstanceof.

>>myRoof isinstanceof Roof 
True 
Questions connexes