有人可以解释为什么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无法正常工作?
最佳答案
关键在于使用Object.create()
var root = Object.create(item1);
创建一个根对象,该对象具有item1作为原型。在这种情况下,
childItems
是原型的一部分。在addChild函数中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中原型的一部分。关于javascript - 在对象内部进行Stringify数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44117553/