Getter属性未在Console.log中返回更新值

时间:2013-08-16 04:00:15

标签: javascript

我对以下情况有点困惑。 我目前正在阅读 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();
};

以上是一个简单的代码,用于设置新创建的Object的原型。 下面是一个简单的代码,当调用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);

因此,当我设置$n对象的genSerialNum时,它会创建一个$n属性genSerialNum,并且在调用getter属性next时,它会增加55到56(因为这是我从chrome dev工具的范围变量中可以看到的),但是在控制台中打印它会显示55.为什么?

enter image description here

4 个答案:

答案 0 :(得分:3)

想一想:

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

请参阅JavaScript Increment operator (++ )

答案 1 :(得分:2)

正如其他人所说的那样,你会看到返回的旧值,因为你正在使用后缀运算符。

道格拉斯·克罗克福德推荐使用+=运算符代替pre / post - / ++ in JavaScript the Good Parts 。(/ p)这个混淆是(部分)的原因。 >

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

答案 2 :(得分:1)

由于您使用了this['$n']++(后缀运算符),因此在将值返回给调用者后,$n的值会增加,如果要打印56,则使用++this['$n'](前缀)操作者)

演示:Fiddle

答案 3 :(得分:-1)

另一种说法@Speransky所说的是这个问题与getter和setter无关,而是++运算符的工作方式。换句话说:

var i = 0; 

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

i++将返回i的原始值,然后将其递增。