在对象Javascript中调用Get和Set函数

时间:2014-03-09 18:13:22

标签: javascript

我正在研究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);我检索了值

2 个答案:

答案 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)