Javascript передача параметров объекту
Передача параметров по значению
Строки, числа, логические значения передаются в функцию по значению. Иными словами при передаче значения в функцию, эта функция получает копию данного значения. Рассмотрим, что это значит в практическом плане:
function change(x) < x = 2 * x; console.log("x in change:", x); >var n = 10; console.log("n before change:", n); // n before change: 10 change(n); // x in change: 20 console.log("n after change:", n); // n after change: 10
Функция change получает некоторое число и увеличивает его в два раза. При вызове функции change ей передается число n. Однако после вызова функции мы видим, что число n не изменилось, хотя в самой функции произошло увеличение значения параметра. Потому что при вызове функция change получает копию значения переменной n. И любые изменения с этой копией никак не затрагивают саму переменную n.
Передача по ссылке
Объекты и массивы передаются по ссылке. То есть функция получает сам объект или массив, а не их копию.
function change(user) < user.name = "Tom"; >var bob =< name: "Bob" >; console.log("before change:", bob.name); // Bob change(bob); console.log("after change:", bob.name); // Tom
В данном случае функция change получает объект и меняет его свойство name. В итоге мы увидим, что после вызова функции изменился оригинальный объект bob, который передавался в функцию.
Однако если мы попробуем переустановить объект или массив полностью, оригинальное значение не изменится.
function change(user)< // полная переустановка объекта user= < name:"Tom" >; > var bob =< name: "Bob" >; console.log("before change:", bob.name); // Bob change(bob); console.log("after change:", bob.name); // Bob
То же самое касается массивов:
function change(array) < array[0] = 8; >function changeFull(array) < array = [9, 8, 7]; >var numbers = [1, 2, 3]; console.log("before change:", numbers); // [1, 2, 3] change(numbers); console.log("after change:", numbers); // [8, 2, 3] changeFull(numbers); console.log("after changeFull:", numbers); // [8, 2, 3]
Передача объекта в Функцию — Переменная ссылается на объект
Продолжим практическое освоение Javascript . Поговорим о передаче объектов в функции.
Если Вы не еще работали с объектами, то смотрите предыдущую практическую задачу, где также есть ссылки на теорию.
1. Читайте теорию об Объектах (перейти к ней можно по выше приведенной ссылке).
2. Полезно будет разобраться с материалом о передаче переменных в функцию.
Передача объектов в функцию — Немного теории
Для начала напомним о том, что при передаче переменной в функцию, в параметр функции копируется значение переменной , но не сама переменная (она не меняет своего исходного значения, и функция работает с копией).
Следующий момент, который следует понимать: в переменной , которая указывает на объект, хранится ссылка на него, но не сам объект .
Следовательно, если передать объект функции, то ей передается не сам объект , а ссылка на него .
Если обратиться к материалу о передаче переменных в функцию, согласно которому в функцию передается копия значения переменной . То выходит, что при передаче объекта функции — в ее параметр передается не ссылка на объект, а копия ссылки на объект .
Переменная — это ссылка на объект, она на него указывает.
В функцию передается копия ссылки на объект.
Для тех, кто запутался — это нужно прочесть и прокрутить в голове несколько раз.
Пример передачи объекта в функцию
1. В качестве примера рассмотрим объект, который содержит свойства, отражающие какие-либо качества и параметры собаки.
/* Объект «Собака» */
var juicy = name : «Джуси» , /* имя собаки */
weight : 15 , /* её вес в кг. */
breed : «Смесь» , /* порода */
loves : «Прогулка» /* любит гулять */
>
— переменная juicy является ссылкой на объект, описывающий характеристики собаки;
2. Напишем функцию для снижения веса собаки .
function lose_Weight( dog , value )
dog .weight = dog .weight — value ;
>
Функция lose_Weight работает со свойством weight (вес) объекта «Собака» и содержит два параметра dog и value:
— в параметр dog следует передать переменную juicy (см. выше), как ссылку на объект;
— в параметр value заносится произвольное число.
Итак, если в параметр dog функции lose_Weight передать переменную juicy , которая ссылается на объект «Собака», то функция снизит вес собаки на указанное во втором параметре число.
/* Объект «Собака» */
var juicy = name : «Джуси» ,
weight : 15 ,
breed : «Смесь» ,
loves : «Прогулка»
>
/* Функция снижения веса */
function lose_Weight( dog ,value)
dog .weight = dog .weight — value;
>
/* Вызываем функцию */
lose_Weight( juicy , 3 );
document . write ( «Собака » + juicy.name + » сейчас весит » + juicy.weight + » килограмм» );
Собака Джуси сейчас весит 12 килограмм
Для тех, кто вник в суть передачи переменных в функцию, решение этой задачи может показаться неожиданным, ведь, напомним, что при работе с переменными в функцию передается копия значения переменной; исходное значение переменной остается прежним .
С объектами дело обстоит иначе : при передаче переменной, которая ссылается на объект, в функцию: все изменения свойств объекта , которые происходят внутри функции , отражаются на исходном объекте . Смотрите сами.
Мы вызвали функцию lose_Weight с параметрами juicy и 3 .
— juicy — это переменная, которая ссылается на объект «Собака»;
Внутри функции происходит обращение к свойству объекта weight — это вес собаки, из значения которого (то есть из 15) вычитается число 3 .
dog.weight = dog.weight — value
В результате изменения , которые были сделаны внутри функции , отразились на исходном объекте .
Итак, процедура передачи в функцию переменной, ссылающейся на объект, позволяет внутри функции менять свойства этого объекта.
Читайте также.
Передача переменой в функцию в JavaScript
Передача функции в функцию — Первоклассные значения
Метод write() объекта document
Объект Window и свойство window
Функция isNaN — Число или не число
Функции parseInt, parseFloat — Конвертация строк
Передача данных по ссылке и по значению – Клонирование объекта
Пример создания табов в JavaScript — Работа с проектом