我遇到一个奇怪的问题,我试图更改特定对象中的属性值,而它正在更改所有对象中的属性值。
下面是我的代码,它们创建这些对象“节点”
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属性。
任何帮助将不胜感激。
答案 0 :(得分:0)
我在您的代码中注意到您有这一行,我想知道这是否是问题的一部分。
filterNode.prototype = Object.create(new processNode(nodeID, 'filter'));
Object.create()返回一个对象,该对象具有processNode
的原型,但没有原型对象本身。因此,您拥有一个与包含另一个原型的对象相等的原型。
filterNode {
__proto__: processNode {
__proto__: processNode.prototype
}
}
这可能归因于您的参考问题。