我对以下情况有点困惑。 我目前正在阅读 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.为什么?
答案 0 :(得分:3)
答案 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
的原始值,然后将其递增。