0

屋根用、ガレージ用、住宅用の 3 つのクラスを持つ JavaScript を作成しています。house クラスは、コンストラクターに Roof と Garage の 2 つの引数を取ります。このコードを実行すると、次のようになります。

オブジェクトを構築できません [このエラーで中断] 新しいエラーをスローします('オブジェクトを構築できません');\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());
4

3 に答える 3

1

myRoofとタイプですmyGarageobject

myRoofが のインスタンスかどうかを確認するには、 Roofisinstanceof を使用します。

>>myRoof isinstanceof Roof
True
于 2009-10-10T23:11:59.443 に答える
1

typeofオペレーターは、オブジェクトの名前ではなく、オブジェクトを返します"object"typeof Operator のドキュメントを参照してください。

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

あなたはおそらく欲しいinstanceof

function House(roof, garage) {
    if (!(roof instanceof Roof) || !(garage instanceof Garage)) {
    ...
于 2009-10-10T23:04:33.500 に答える
1

Richie が指摘したように、typeof は関数の名前ではなく「オブジェクト」を返します。「コンストラクター」プロパティを使用する必要があります。「instanceof」演算子を使用します。

また、特定のエラーに基づいて異なるエラー メッセージをスローするために、(あなたのように 1 つではなく) 2 つの「if ステートメント」を使用しました。これはもう少しコードが増えることを意味するかもしれませんが、コードが壊れると、何が問題だったのかが正確にわかります。

動作デモ →

コード:

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());
于 2009-10-10T23:08:21.837 に答える