重新分配函数返回的引用对象

问题描述 投票:0回答:2

创建一个对象并从一个函数返回它。

var obj = {
    color : 'green'
}

function returnObj(){
    return obj
}

console.log(JSON.stringify(obj))
>>>{color : 'green'}

以这种方式添加新的键值对起作用。返回值(如对象或数组)的条目是引用。

returnObj().size = "big"
console.log(JSON.stringify(obj))
>>>{color : 'green', size  : 'big'}

重新分配它新的对象不起作用。

returnObj() = { yellow : 'house'}
>>> ReferenceError: Invalid left-hand side in assignment

我想要做的是强制函数返回一个l值而不是一个r值。以下也不起作用。

returnObj().this = { yellow : 'house'}
console.log(JSON.stringify(obj))
>>>{"color":"green","size":"big","this":{"yellow":"house"}}

这样做的原因是,根据用户设置,有不同的对象可供参考。

var data = {
house: {color: 'green'}
car : {speed: "fast"},
}

var setting = 'house'

function returnDataObj(){
return obj[setting]
}
javascript javascript-objects lvalue
2个回答
0
投票

您不能以这种方式为函数赋值。例如,您应该将参数传递给函数(returnObj)

var obj = {
color : 'green'
}

function returnObj(key , value){
  obj[key] = value;
  return obj;
}

obj = returnObj("size","big");
console.log(JSON.stringify(obj))

0
投票

函数返回始终返回值而不是引用。对象条目和数组条目是该值内的引用。

var obj = { color : 'green' }

var reference_to_obj = obj
reference_to_obj.color = 'red'
console.log(obj.color)
>>>red

function return_obj(){return obj}
return_obj().color = "blue"
console.log(obj.color)
>>>blue

这三个都引用相同的对象内容

但我们可以将名称“reference_to_obj”重新分配给另一个值

reference_to_obj = 'string'

函数return_obj()的行为类似于对象的“匿名”引用。只知道对象/数组的内容,但不知道保存在它下面的变量名。

return_obj() = {} //is similar to 
AnonymousReference_1231kf10h1kf1 = {} // pseudocode for illustration

解决方法:

1.在变量中存储动态引用。不幸的是,您必须记住在引用应该更改时调用更新函数

var objectReference;
function updateObjectReference(){
objectReference = obj[setting]
}

2.内嵌嵌套:更深一层

var obj = {content : {color: green}}
returnObj().content = {size: big}

3.Outer Nesting:全局对象窗口。

window[returnObjectNameString()]={size: big}

4.函数返回对象,但也可以替换它。

function returnObj(replacementObj){
if(typeof replacementObj !== 'undefined'){ obj = replacementObj }
return obj
}

5.删除所有值并分配新值。注意:它仍然是一个对象。

var props = Object.keys(returnObj());
for (var i = 0; i < props.length; i++) {
  delete returnObj()[props[i]];
}
© www.soinside.com 2019 - 2024. All rights reserved.