10

有人可以向我解释为什么这段简单的代码不起作用吗?

var user = {
    get name() {
        return this.name;
    },    
    set name(value) {
        this.name = value;
    }
};
user.name = 'David';

当我把它放在 Firefox 21.0 的 Firebug 控制台中时,它给了我这个错误:

InternalError: too much recursion
this.name = value;

为什么?在 Javascript 中定义 getter 和 setter 的正确方法是什么?

4

3 回答 3

14

当您尝试设置name时,该功能将设置this.name = value

但该功能现在正试图设置name. 因此它将再次调用该函数并设置this.namevalue.

但该功能现在正试图设置name. 因此它将再次调用该函数并设置this.namevalue.

但该功能现在正试图设置name. 因此它将再次调用该函数并设置this.namevalue.

....... 一段时间以后 .......

但该功能现在正试图设置name. 因此它将再次调用该函数并设置this.namevalue.

但是浏览器已经确定调用堆栈太深,函数调用自身的次数太多,因此为了防止完全崩溃,它会导致函数失败并出现您看到的错误。


尝试使用不同的属性名称,例如this._name,来存储和检索值。

于 2013-06-17T15:33:08.783 回答
14

你的二传手正在调用自己。

这是一个解决方案:

var user = {
    get name() {
        return this._name;
    },    
    set name(value) {
        this._name = value;
    }
};
user.name = 'David';

旁注:注意IE8 不支持getand运算符。set

于 2013-06-17T15:34:15.867 回答
5

尝试,

var user = {
    get name() {
        return this._name;
    },    
    set name(value) {
        this._name = value;
    }
};
user.name = 'David';

注意使用_name代替namename在 setter of 中设置的值name是一个递归调用,因此是例外。

于 2013-06-17T15:33:42.760 回答