6

コンストラクター内で特定の条件を持つオブジェクトを作成しないオプションはありますか?

function Monster(name, hp) {
    if (hp < 1) {
       delete this;
    }
    else {
           this.name = name;
    }
}
var theMonster = new Monster("Sulley", -5); // undefined
4

3 に答える 3

5

あなたがすべきことは、例外をスローすることだと思います。

function Monster(name, hp) {
    if (hp < 1) {
        throw "health points cannot be less than 1";
    }
    this.hp = hp;
    this.name = name;
}

var m = new Monster("Not a good monster", 0);
于 2013-03-12T07:59:00.947 に答える
4

コンストラクターとして (演算子を使用して) 呼び出された関数は、明示的にオブジェクトを返さない限りnew、常にインスタンスを返します。したがって、空のオブジェクトを返し、演算子を使用して返されたものを確認できます。instanceof

function Monster(name, hp) {
    if (hp < 1) {
       return {};
    }
    else {
       this.name = name;
    }
}
var theMonster = new Monster("Sulley", -5);

console.log(theMonster instanceof Monster); // false

この動作は、仕様 ( 13.2.2 ) で説明されています。

 8. resultを F の [[Call]] 内部プロパティを呼び出した結果とし、obj を this 値として提供し、[[Construct]] に渡された引数リストをargsとして提供します。

 9. Type(result) が Object の場合、 result を返します。

 10. obj を返します。

ただし、他の人が指摘しているように、実際にこれを行うべきかどうかは疑問です。

于 2013-03-12T07:59:59.213 に答える
1

意味がありません。構築段階でオブジェクトの構築を停止しようとしています。より良い方法は、@Amberlamps によって提案されたものを使用するか、ファクトリ パターンのようなものを使用してオブジェクトを作成することです。

于 2013-03-12T08:01:43.697 に答える