Проблема с конструктором объектов JavaScript, где аргументами являются другие объекты - PullRequest
0 голосов
/ 11 октября 2009

Я пишу немного JavaScript с тремя классами, один для крыш, один для гаражей и один для домов. Класс дома принимает два аргумента для своего конструктора, Крыша и Гараж. Когда я запускаю этот код, я получаю:

невозможно построить объект [Разорвать на эту ошибку] ​​генерировать новую ошибку («невозможно построить объект»); \ n

в Firebug, хотя объекты явно имеют правильный тип. Есть идеи, что я делаю не так? Вот код:

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());

Ответы [ 3 ]

1 голос
/ 11 октября 2009

Как заметил Ричи, typeof вернет 'object', а не имя функции. Вы должны использовать свойство 'constructor' . Используйте оператор instanceof.

Кроме того, я использовал два оператора if (вместо одного, как вы сделали), чтобы выдавать разные сообщения об ошибках в зависимости от конкретной ошибки. Это может означать немного больше кода, но когда код ломается, вы точно знаете, что пошло не так.

Рабочая демонстрация & rarr;

Код:

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());
1 голос
/ 11 октября 2009

myRoof и myGarage являются object типами.

Если вы хотите проверить, является ли myRoof экземпляром Roof, используйте isinstanceof.

>>myRoof isinstanceof Roof
True
1 голос
/ 11 октября 2009

Оператор typeof вернет "object" для ваших объектов, а не их имен. См. Тип документации оператора .

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

Вы, вероятно, хотите instanceof:

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