繁体   English   中英

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

[英]Javascript Unintentionally Changing Multiple Objects' Array Attribute

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

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

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属性。

任何帮助,将不胜感激。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM