Переназначение ссылочного объекта, возвращаемого функцией - PullRequest
0 голосов
/ 02 апреля 2019

Создание объекта и возвращение его из функции работает.

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]
}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Функция return всегда возвращает значение, а не ссылку. Записи объекта и записи массива являются ссылками внутри этого значения.

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.Наружное размещение: окно глобального объекта.

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]];
}
0 голосов
/ 02 апреля 2019

Вы не можете назначить значение для функции таким образом. Вы должны передать параметры в функцию (returnObj) например

var obj = {
color : 'green'
}

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

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