我正在研究book 但我不明白以下几点。 我有一个这样的对象
var serialnum = {
// This data property holds the next serial number.
// The $ in the property name hints that it is a private property.
$n: 10,
// Return the current value and increment it
get next() {
return this.$n++;
},
// Set a new value of n, but only if it is larger than current
set next(n) {
if (n >= this.$n) this.$n = n;
else throw "serial number can only be set to a larger value";
}
};
$
暗示它是私有财产。如果我console.log(serialnum.$n);
我看到10.没有私人?
设定值
如果我serialnum.next(100);
我有这个错误Property 'next' of object #<Object> is not a function
如果我serialnum.$n = -100;
我可以设置一个值
获得价值
好的,如果我console.log(serialnum.next);
我检索了值
答案 0 :(得分:2)
通常,它是这样做的:
旧路
var serialnum = (function() {
var $n = 10; // private
return {
next: function(n) {
if (n === void(0)) return ++$n;
if (n >= $n) return this.$n = n;
throw "serial number can only be set to a larger value";
}
};
})();
serialnum.next(); // 11
serialnum.next(15); // 15
新方法:吸气者和背叛者
var serialnum = (function() {
var $n = 10; // private
return {
get next() {
return ++$n;
},
set next(n) {
if (n >= $n) return $n = n;
throw "serial number can only be set to a larger value";
}
};
})();
serialnum.next; // 11
serialnum.next = 15; // 15
然后,由于$n
在函数内声明,因此它是私有变量 - 无法从外部访问。
但next
是特权方法(或具有特权getter和setter):因为它在函数内部声明,它可以读/写私有变量;因为它被导出(返回)到外面,所以可以从外面调用它。
请注意,外部代码可以修改特权方法,但不会使它们成为读/写私有变量。
另见Douglas Crockford撰写的Private Members in JavaScript。
答案 1 :(得分:0)
$
提示它是私有属性,这意味着$
符号只是一种编码约定,可在您使用时提醒您。 Property 'next' of object #<Object> is not a function
:了解javascript getter / setter: