Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 超出getter setter最大调用堆栈大小错误_Javascript - Fatal编程技术网

Javascript 超出getter setter最大调用堆栈大小错误

Javascript 超出getter setter最大调用堆栈大小错误,javascript,Javascript,我正在尝试学习如何在JavaScript对象中获取和设置我尝试过的对象 function ab(n){this.name=n;}; var c= new ab("abcde"); console.log(c); Object.defineProperty(c, 'name', { get: function() { return name; }, set: function(Name) { this.name = Name;

我正在尝试学习如何在JavaScript对象中获取和设置我尝试过的对象

function ab(n){this.name=n;}; 
var c= new ab("abcde");  
console.log(c);
Object.defineProperty(c, 'name', {
    get: function() {
        return name;
    },
    set: function(Name) {
       this.name = Name;
        }
}); 
c.name="xyz";  
console.log(c.name); 

在这里,我首先使用构造函数创建对象,然后使用get和set。但我得到错误“超过了最大调用堆栈大小”。我不明白这个错误的原因。感谢您的帮助

set语法将对象属性绑定到试图设置该属性时要调用的函数

你不需要做
this.name=name
内部设置函数。
这会递归触发setter,导致堆栈溢出。
事实上,在这种情况下,你根本不需要一个二传手。仅当设置或修改属性时必须执行一些额外工作时,才使用setter


您使用的
Object.defineProperty()
错误。在这种情况下,应该调用未初始化的
对象
ab

Object.defineProperty(ab, 'name', { //.. };

将属性(
名称
)命名为要将属性添加到的对象中的支持字段。此外,
集合中的
运算符引用了错误的范围(具体来说,它的范围是属性,而不是对象);因此,递归地设置
name
属性,导致堆栈溢出异常

您可以按如下方式修改代码:

function myObject(n){ 
    this.nameValue = n;

    Object.defineProperty(this, 'name', {
         get: function() {
            return this.nameValue;
        },
        set: function(value) {
           this.nameValue = value;
        }
    }); 
}

var c = new myObject("foo");  
console.log(c.name);       //logs "foo"

c.name="bar";  
console.log(c.name);      //logs "bar"

name
属性的
get
set
组件中的
this
关键字现在指的是myObject函数定义的对象,因为
object.defineProperty
调用在该函数中。

我想已经解释过了,setter中的
this.name=name
再次调用setter,从而导致无限递归

这个怎么样

function Ab(_name){
    Object.defineProperty(this, "name", {
        //enumerable: true, //maybe?
        get: function(){ return _name },
        set: function(value){ _name = value }
    });
}

var c = new Ab("abcde");
console.log(c, c.name);
或者原型方法
缺点:私有财产
\u name
是公共财产

function Ab(n){
    this.name = n;
}
Object.defineProperty(Ab.prototype, "name", {
    get: function(){ return this._name },
    set: function(value){ this._name = value }
});
或ES6
和原型的aproach差不多

class Ab{
    constructor(n){
        this.name = n;
    }

    get name(){ return this._name },
    set name(value){ this._name = value }
}

代码是正确的。只是,他在setter中设置变量,再次触发setter。您只是在构造函数中创建accessor属性。甚至不需要使用defineProperty方法。第二种和第三种方法对我的案例效果最好,谢谢你的回答!这->“导致无限递归”。确保你的getter不仅仅是“returnthis.myprop”,例如“return'myprop:'+this.myprop”