创建一个对象并从一个函数返回它。
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]
}
您不能以这种方式为函数赋值。例如,您应该将参数传递给函数(returnObj)
var obj = {
color : 'green'
}
function returnObj(key , value){
obj[key] = value;
return obj;
}
obj = returnObj("size","big");
console.log(JSON.stringify(obj))
函数返回始终返回值而不是引用。对象条目和数组条目是该值内的引用。
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]];
}