0

我有点坚持以下情况。我目前正在阅读JavaScript:权威指南,并在 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);

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

在此处输入图像描述

4

4 回答 4

4

想一想:

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

请参阅JavaScript 增量运算符 (++)

于 2013-08-16T04:10:36.620 回答
2

正如其他人所说,您看到返回的旧值是因为您使用的是后缀运算符。

这种混淆是 Douglas Crockford 建议在JavaScript the 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 所说的另一种说法是,这个问题与 getter 和 setter 无关,而与++操作员的工作方式有关。换一种方式:

var i = 0; 

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

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

于 2013-08-16T04:19:54.500 回答