有人可以解释为什么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/

10-09 12:50