Есть ли практическое применение для копирования объекта по ссылке? - PullRequest
1 голос
/ 27 декабря 2011

Javascript копирует объекты по ссылке, а не буквально.Например:

var myObject = {};
var myCopy = myObject;

myObject.foo = "bar";

alert(myCopy.foo); //alerts "bar"

Но я действительно изо всех сил пытаюсь придумать практическую, реальную причину этого, кроме того, чтобы дать разработчикам способ сделать код немного более читабельным (так как вы можете по-разному использовать один и тот же объектразные имена).

Скорее всего, я упустил суть, поэтому кто-нибудь может сказать мне, что это за точка?

Ответы [ 3 ]

4 голосов
/ 27 декабря 2011

После записи:

var myObject = {};

В памяти есть объект, на который вы можете ссылаться по имени myObject.Следующее задание:

var myCopy = myObject;

... говорит, что myCopy теперь относится к тому же объекту, где бы он ни находился.Это то же самое, что происходит, когда вы передаете аргумент функции:

function somefunc(localName) {
    // body
}
someFunc(myCopy);

Теперь есть переменная с именем localName, которая local to someFunc это также относится к тому же объекту в памяти.

Это фундаментальный способ, которым мы передаем ссылки на объект, чтобы на него можно было ссылаться под разными именами в разных областях.

Мы можем скопировать всю структуру в новое место в памяти.Ничто не мешало дизайнерам создать язык, который бы это делал.Но это менее эффективно - думать о глубоко вложенных объектах - и, как правило, не о том, что вы хотите делать.Например, если функция изменила одно свойство объекта, ей нужно будет вернуть весь объект, чтобы это изменение сохранялось за пределами функции.И вызывающая сторона должна была бы обработать это возвращаемое значение, решая, нужно ли сохранить старый объект или его может перезаписать только что созданная, немного другая копия.

Опять же, в принципе, в этом направлении дизайна нет ничего плохого;это просто не то, как был разработан JavaScript.

1 голос
/ 27 декабря 2011

Это зависит;в вашем случае это может быть довольно запутанным, поскольку не служит реальной цели.Тем не менее, для более длинных путей к объекту может быть выгодно хранить объект в отдельной переменной, потому что для этого требуется меньше вводов для каждого оператора, который использует объект, например, в этом примере:

0 голосов
/ 27 декабря 2011

Мое мнение (и это не более того) заключается в том, что создание объекта по ссылке (а не путем копирования), как правило, более полезно и того, что хочет пользователь. Если вы передаете объект в качестве параметра в метод, вы (почти всегда) заинтересованы в том, чтобы объект обрабатывался и изменялся этим методом, а не работал с копией (и оставлял оригинал нетронутым). Очевидно, что есть обстоятельства, когда это не так, и было бы неплохо иметь возможность выбора, но я не могу вспомнить, чтобы когда-либо обнаружил, что хочу просто передать копию объекта в метод, и обычно я очень благодарен что вещь, с которой я работаю, это вещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...