0

では、2 つの値と 1 つの関数を持つ非常に基本的な人物オブジェクトがあるとします。

function personObject() {
    this.name = 'First Name';
    this.placeInLine = 1;
    this.setPlaceInLine = function(place) {
        this.placeInLine = place;
    }
}

そして、次のようにいくつかの変数をセットアップします。

var john = new personObject();
var bill = new personObject();
var message = "";

以下の 3 つのコード スニペットを見てください...

---コード #1---

if(john.placeInLine < bill.placeInLine) message = "John is before Bill";
else message = "John is not before Bill";

結果: message = "John は Bill の前ではありません"; // 1 は 1 未満ではないため

---コード #2---

bill.setPlaceInLine(2); // change Bill's place to 2 (instead of default of 1)
if(john.placeInLine < bill.placeInLine) message = "John is before Bill";
else message = "John is not before Bill";

結果: message = "John は Bill の前です"; // 1 が 2 より小さいため;

---コード #3---

if(john.placeInLine < bill.setPlaceInLine(2)) message = "John is before Bill";
else message = "John is not before Bill";

RESULT: message = "John is not before Bill": // なぜ?

比較後に .setPlaceInLine 関数が呼び出されていますか? それとも、その関数を実行すると、john.placeInLine と比較される何かが返されますか?

4

3 に答える 3

8

method には明示的な return がないためsetPlaceInLine、 を返しますundefined。そして1 < undefinedに評価されfalseます :undefinedに変換されNumber、 が与えられNaN1 < NaN確かにfalse(1 > NaNfalseそうです)。

セッターメソッドが割り当てられた値を返すようにすることでこれを修正できますが:

PersonObject.prototype.setPlaceInLine = function(place) {
  return this.placeInLine = place;
}

...セッターとゲッターを別々に使用する方が良い(よりクリーン)と思います(コード#2の例のように)。

補足として、プロトタイプを使用してオブジェクト メソッドを設定することをお勧めします (サンプル コードで行ったように)。この理由は、この回答this.someMethodでかなりよく説明されています。基本的に、プロトタイプを使用すると、コンストラクターが呼び出されるたびに新しい関数を作成するときに、作成されたすべてのオブジェクトで使用される単一の関数エンティティを作成します。

于 2012-10-22T15:14:44.887 に答える
1

関数の戻り値と比較しています。

実際にそれを介して値を返さない限り、常に結果return this.placeInLine;となる と比較されます。undefinedfalse

コードを次のように変更します。

this.setPlaceInLine = function(place) {
    return this.placeInLine = place;
}
于 2012-10-22T15:16:34.533 に答える
-1

setPlaceInLine は何も返しません。また、1 未満と評価されるものはありません。値を返すように setPlaceInLine を更新できます。

function personObject() {
    this.name = 'First Name';
    this.placeInLine = 1;
    this.setPlaceInLine = function(place) {
        this.placeInLine = place;
        return place;
    }
}
于 2012-10-22T15:16:44.407 に答える