0

私は以下のシナリオに少しこだわっています。私は現在JavaScript: The Definitive Guideを読んでおり、Accessor プロパティの下に以下のコードが付属しています。

function inherit(p) {
    if (p == null) throw TypeError();

    if (Object.create) {
        return Object.create(p);
    }

    var t = typeof p;
    if (t !== 'Object' && t !== 'function') throw TypeError();

    function f() {};
    f.prototype = p;
    return new f();
};

上記は、新しく作成されたオブジェクトのプロトタイプを設定する単純なコードです。next以下は、が呼び出されたときに 55 より大きい値、つまり 56 を返す単純なコードです。

var serialNum = {
    $n: 0,

    get next() {
        return this['$n']++;
    },

    set next(n) {
        if (n >= this.$n) {
            this.$n = n;
        } else {
            throw 'serial number can only be set to a larger value';
        }
    }
};

var genSerialNum = inherit(serialNum);
genSerialNum.$n = 55;
console.log(genSerialNum.next);

したがって$ngenSerialNumオブジェクトを設定すると、$nプロパティが作成さgenSerialNumれ、getter プロパティが呼び出されると、next55 から 56 に増加します (これは、Chrome 開発ツールのスコープ変数から確認できるため)。ただし、コンソールで印刷すると、55 が表示されます。 。 どうして?

ここに画像の説明を入力

4

4 に答える 4

4

考えてみてください:

> i = 0
0
> i++
0
> i
1

JavaScript インクリメント演算子 (++ )を参照してください。

于 2013-08-16T04:10:36.620 に答える
2

他の人が言ったように、後置演算子を使用しているため、古い値が返されています。

この混乱は、Douglas Crockford がJavaScript の Good Parts+=で pre/post --/++ の代わりに演算子を使用することを推奨する理由 (の一部)です。

get next(){
    return this['$n'] += 1;
}
于 2013-08-16T04:17:37.377 に答える
1

this['$n']++(後置演算子)を$n使用したため、値が呼び出し元に返された後に値がインクリメントされます。56 を出力する場合は、++this['$n'](前置演算子)を使用します。

デモ:フィドル

于 2013-08-16T04:10:10.067 に答える
-1

@Speranskyが言っていることを別の方法で言うと、この問題はゲッターとセッターとは関係なく、++オペレーターの動作方法にあるということです。別の言い方をすれば:

var i = 0; 

console.log(i); // 0
console.log(i++); // 0
console.log(i); // 1

i++の元の値を返し、iインクリメントします。

于 2013-08-16T04:19:54.500 に答える