Question

J'écris un peu de JavaScript avec trois classes, une pour les toits, l'une pour les garages et un pour les maisons. La classe maison prend deux arguments à son constructeur, un toit et un garage. Quand je lance ce code je reçois:

ne peut pas construire 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. Toute 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());
Était-ce utile?

La solution

L'opérateur typeof retournera "object" pour vos objets, pas leurs noms. Voir la documentation de l'opérateur typeof .

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

Vous voulez probablement instanceof :

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

Autres conseils

myRoof et myGarage sont les types object.

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

>>myRoof isinstanceof Roof
True

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'.

De plus, je l'ai utilisé deux « si les déclarations » (au lieu d'un, comme vous l'avez fait) de lancer un message différent d'erreur basé sur l'erreur particulière. Cela peut signifier un peu plus de code, mais quand les pauses de code, vous savez exactement ce qui a mal tourné.

travail → démonstration

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());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top