JavaScript意外更改了多个对象的数组属性

时间:2018-06-29 20:43:04

标签: javascript jquery object reference

我遇到一个奇怪的问题,我试图更改特定对象中的属性值,而它正在更改所有对象中的属性值。

下面是我的代码,它们创建这些对象“节点”

function processNode(nodeID, name, fields){
    this.id =  nodeID;
    this.fields = fields;
    this.name = name;
}

var nodeFuncs = {table:
    function(nodeID){
        function tableNode() {}
        tableNode.prototype = Object.create(new terminalNode(nodeID, 'table'));
        return new tableNode(nodeID, 'table');
    }
    , source:
    function(nodeID){
        function sourceNode() {}
        sourceNode.prototype = Object.create(new processNode(nodeID, 'source'));
        sourceNode.prototype.table = '';
        sourceNode.prototype.selectors = '';
        sourceNode.prototype.include = 1;

        return new sourceNode(nodeID, 'source', []);
    }
    , sort:
    function(nodeID){
        function sortNode() {}
        sortNode.prototype = Object.create(new processNode(nodeID, 'sort'));
        sortNode.prototype.order = [];

        return new sortNode(nodeID, 'sort', [])
    }
    , filter:
    function(nodeID){
        function filterNode() {}
        filterNode.prototype = Object.create(new processNode(nodeID, 'filter'));
        filterNode.prototype.names = [];

        return new filterNode(nodeID, 'filter', [])
    }
}

function createNode(nodeID, name){
    return nodeFuncs[name](nodeID);
}

idToNodeObjectMap['abc123'] = createNode('abc123', 'source')
idToNodeObjectMap['abc124'] = createNode('abc124', 'sort')
idToNodeObjectMap['abc125'] = createNode('abc125', 'filter')
idToNodeObjectMap['abc126'] = createNode('abc126', 'filter')

这是一个示例jquery事件,它触发了对象属性的重新评估:

$('body').on('click', "div button.ok", function(){
    var nodeID = $(this).parent('div.nodeForm').attr('id')
    var objectNode = idToNodeObjectMap[nodeID];
    objectNode.fields.splice(1,1);
});

例如,我将有4个对象,并将其中一个作为var objectNode引用,其.fields值为['tid','gid','tname']。然后,当我调用objectNode.fields.splice(1,1)时,.fields值将是['tid','tname']所有4个对象的值,而不仅仅是objectNode变量中引用的对象。

但是,当我换线时...     objectNode.fields.splice(1,1); 至...     objectNode.fields = ['hi']; 那么它只会更改我引用为var objectNode的对象的.fields属性。

有人知道为什么会这样吗?我认为这可能是一个引用问题,其中所有.field都在引用并更改彼此的值,但是这对我来说似乎没有意义,因为当我将.fields属性设置为['hi']时,它只会更改一个对象的.fields属性。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我在您的代码中注意到您有这一行,我想知道这是否是问题的一部分。

filterNode.prototype = Object.create(new processNode(nodeID, 'filter'));

Object.create()返回一个对象,该对象具有processNode的原型,但没有原型对象本身。因此,您拥有一个与包含另一个原型的对象相等的原型。

filterNode {
    __proto__: processNode {
        __proto__: processNode.prototype
    }
}

这可能归因于您的参考问题。