Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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 字符串化对象内的数组_Javascript_Json - Fatal编程技术网

Javascript 字符串化对象内的数组

Javascript 字符串化对象内的数组,javascript,json,Javascript,Json,有人能解释一下为什么JSON.stringify输出不同于item1和item2对象吗 var item1 = { name: '', childItems: [], addChild: function (name) { var child = Object.create(item1); child.name = name; this.childItems.push(child); } }; var item2

有人能解释一下为什么JSON.stringify输出不同于item1和item2对象吗

var item1 = {
    name: '',
    childItems: [],
    addChild: function (name) {
        var child = Object.create(item1);
        child.name = name;
        this.childItems.push(child);
    }
};

var item2 = {
    name: '',
    addChild: function (name) {
        var child = Object.create(item2);
        child.name = name;
        if (this.childItems === undefined){
            this.childItems = [];
        }
        this.childItems.push(child);
    }
};
串接对象

var root = Object.create(item1);
root.name = 'root';
root.addChild('child');
console.log(JSON.stringify(root)); //{"name":"root"}

root = Object.create(item2);
root.name = 'root';
root.addChild('child');
console.log(JSON.stringify(root)); //{"name":"root","childItems":[{"name":"child"}]}
后者是我正在寻找的结果,但我不明白为什么item1不工作?

如前所述:


childItems
在第一个示例中属于 原型,而在第二个示例中,您使用当前 例如

如前所述:


childItems
在第一个示例中属于 原型,而在第二个示例中,您使用当前 例如


此代码字符串中的问题:

 if (this.childItems === undefined){
      this.childItems = [];
 }
在item1中,childItems属性未定义,但您尝试将项添加到它
this.childItems.push(child)

在item2中,将数组指定给childItems属性:

if (this.childItems === undefined){
     this.childItems = [];
}
因此,您的代码必须如下所示:

var item1 = {
    name: '',
    childItems: [],
    addChild: function (name) {
        var child = Object.create(item1);
        child.name = name;
        this.childItems = [];
        this.childItems.push(child);
    }
};

var item2 = {
    name: '',
    addChild: function (name) {
        var child = Object.create(item2);
        child.name = name;
        this.childItems = [];
        this.childItems.push(child);
    }
};

此代码字符串中的问题:

 if (this.childItems === undefined){
      this.childItems = [];
 }
在item1中,childItems属性未定义,但您尝试将项添加到它
this.childItems.push(child)

在item2中,将数组指定给childItems属性:

if (this.childItems === undefined){
     this.childItems = [];
}
因此,您的代码必须如下所示:

var item1 = {
    name: '',
    childItems: [],
    addChild: function (name) {
        var child = Object.create(item1);
        child.name = name;
        this.childItems = [];
        this.childItems.push(child);
    }
};

var item2 = {
    name: '',
    addChild: function (name) {
        var child = Object.create(item2);
        child.name = name;
        this.childItems = [];
        this.childItems.push(child);
    }
};

关键在于使用
Object.create()

创建一个根对象,该对象将item1作为原型。在这种情况下,
childItems
是原型的一部分。内加子函数

addChild: function (name) {
    var child = Object.create(item1);
    child.name = name;
    this.childItems.push(child);
}
由于这是根目录,并且没有在根目录中定义childItems,所以会在原型链中搜索它。因为item1是它的原型,并且定义了childItems,所以您要在这里添加项

item2也是如此,但有一个例外:在
addChild
函数中

if (this.childItems === undefined){
     this.childItems = [];
}
this.childItems.push(child);
此行
this.childItems=[]
在对象根目录中创建一个数组childItems,隐藏在使用
object.create(item2)
时设置的原型中定义的childItems。这就是为什么您会在第二个
console.log(root)
中看到添加的项


this.childItems===undefined
也给出undefined(允许创建数组),因为它不是item2中原型的一部分。

关键在于使用
对象。create()

创建一个根对象,该对象将item1作为原型。在这种情况下,
childItems
是原型的一部分。内加子函数

addChild: function (name) {
    var child = Object.create(item1);
    child.name = name;
    this.childItems.push(child);
}
由于这是根目录,并且没有在根目录中定义childItems,所以会在原型链中搜索它。因为item1是它的原型,并且定义了childItems,所以您要在这里添加项

item2也是如此,但有一个例外:在
addChild
函数中

if (this.childItems === undefined){
     this.childItems = [];
}
this.childItems.push(child);
此行
this.childItems=[]
在对象根目录中创建一个数组childItems,隐藏在使用
object.create(item2)
时设置的原型中定义的childItems。这就是为什么您会在第二个
console.log(root)
中看到添加的项


this.childItems===undefined
也给出undefined(允许创建数组),因为它不是item2中原型的一部分。

谢谢大家的帮助

不确定这是否是最优雅的解决方案,但这是我提出的,而且似乎有效

var item = {
    name: '',
    childItems: [],
    addChild: function (name) {
        var child = Object.create(item);
        child.name = name;
        child.childItems = [];
        this.childItems.push(child);
    }
};

item.name = 'root';
item.addChild('child1');
item.childItems[0].addChild('child2');
console.log(JSON.stringify(item));
//{"name":"root","childItems":[{"name":"child1","childItems":[{"name":"child2","childItems":[]}]}]}

谢谢大家的帮助

不确定这是否是最优雅的解决方案,但这是我提出的,而且似乎有效

var item = {
    name: '',
    childItems: [],
    addChild: function (name) {
        var child = Object.create(item);
        child.name = name;
        child.childItems = [];
        this.childItems.push(child);
    }
};

item.name = 'root';
item.addChild('child1');
item.childItems[0].addChild('child2');
console.log(JSON.stringify(item));
//{"name":"root","childItems":[{"name":"child1","childItems":[{"name":"child2","childItems":[]}]}]}

childItems
在第一个示例中属于原型中的对象,而在第二个示例中,您使用当前实例创建了一个。谢谢Sirko。有没有比item2更优雅的创建对象的方法??我不想测试数组是否未定义。我会使用构造函数添加实例属性,只需将方法保留在原型上即可。
childItems
在第一个示例中属于原型中的对象,而在第二个示例中,您使用当前实例创建了一个。谢谢Sirko。有没有比item2更优雅的创建对象的方法??我不想测试数组是否未定义。我会使用构造函数添加实例属性,只需将方法保留在原型上。谢谢Gonzalo。所以主要的问题是我将子对象添加到item1中,而不是root中。谢谢Gonzalo。所以主要的问题是我将子对象添加到item1中,而不是根对象中。