Javascript 字符串化对象内的数组
有人能解释一下为什么JSON.stringify输出不同于item1和item2对象吗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
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中,而不是根对象中。