18.02.2016, 20:01
|
Новичок на форуме
|
|
Регистрация: 18.02.2016
Сообщений: 2
|
|
Помогите с объектами
function a(arg){
/*arg.value += 2;
return arg;*/
}
var c =
{
name: 'Название 1',
value: 2
};
var b = a(c);
console.log(c);
Помогите решить проблему. Функция a() должна создать новый объект такой же структуры как аргумент и в этом новом объекте приплюсовать 2.
|
|
18.02.2016, 20:24
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Надо функцию конструктор писать. В JS же копирование объектов по ссылке.
<script>
var c =
{
name: 'Название 1',
value: 2
};
b = c;
b.value = 5;
alert(c.value);
</script>
|
|
18.02.2016, 20:33
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Типо такого.
<script>
function Obj(name, value) {
this.name = name;
this.value = value;
};
function a(arg) {
b = new Obj(arg.name, arg.value);
b.value += 2;
return b;
}
var c = new Obj('Название 1', 2);
var b = a(c);
alert(b.value);
alert(c.value);
</script>
Последний раз редактировалось destus, 18.02.2016 в 20:51.
|
|
18.02.2016, 20:43
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
destus,
клон обьекта обьекта нужен в функции a
|
|
18.02.2016, 20:54
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
destus,
маловато будет - но по сути уже верно
|
|
18.02.2016, 20:57
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Сообщение от рони
|
destus,
маловато будет - но по сути уже верно
|
В ожидании твоего решения.. Через веб воркера с индикатором процесса копирования.
|
|
18.02.2016, 20:59
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
destus,
if (!Object.assign) Object.defineProperty(Object, "assign", {
enumerable: false,
configurable: true,
writable: true,
value: function(target, firstSource) {
if (target === undefined || target === null) throw new TypeError("Cannot convert first argument to object");
var to = Object(target);
for (var i = 1; i < arguments.length; i++) {
var nextSource = arguments[i];
if (nextSource === undefined || nextSource === null) continue;
var keysArray = Object.keys(Object(nextSource));
for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
var nextKey =
keysArray[nextIndex];
var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
if (desc !== undefined && desc.enumerable) to[nextKey] = nextSource[nextKey]
}
}
return to
}
});
function a(arg) {
var copy = Object.assign({}, arg);
copy.value += 2;
return copy
}
var c = {
name: "Название 1",
value: 2
};
var b = a(c);
alert([b.value, c.value]);
|
|
18.02.2016, 20:59
|
Новичок на форуме
|
|
Регистрация: 18.02.2016
Сообщений: 2
|
|
Сообщение от destus
|
Типо такого.
<script>
function Obj(name, value) {
this.name = name;
this.value = value;
};
function a(arg) {
b = new Obj(arg.name, arg.value);
b.value += 2;
return b;
}
var c = new Obj('Название 1', 2);
var b = a(c);
alert(b.value);
alert(c.value);
</script>
|
Спасибо за ответ, но уже нашёл решение и сделал так:
function a(arg) {
var clone = JSON.parse(JSON.stringify(arg));
clone.value += 1;
return clone;
}
var c = {
name: 'Название 1',
value: 2
};
var b = a(c);
console.log(c.value); // 2
console.log(b.value); // 3
|
|
18.02.2016, 21:04
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
рони,
|
|
18.02.2016, 21:12
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
destus,
количество свойств неизвестно, поэтому, и даже ТС предпочёл костыль только чтоб не перечислять все.
|
|
|
|