Object Referencing in JavaScript 
In JavaScript, objects can reference other objects, allowing for the creation of complex, interconnected data structures. This feature is particularly useful for representing real-world relationships and hierarchies in your code.
poznámka
dleap restrictions - porovnávání a this
Referencing Other Objects 
An object can reference another object simply by including it as a property value. This creates a relationship between the two objects, where one object "contains" or "points to" the other.
Example: 
const address = {
    street: "123 Main St",
    city: "Anytown",
    country: "Anycountry"
};
const person = {
    firstName: "John",
    lastName: "Doe",
    age: 30,
    homeAddress: address // Reference to another object
};
console.log(person.homeAddress.street); // Output: 123 Main StIn this example, the person object has a property named homeAddress that references the address object. You can access the properties of the address object through the person object.
Manipulating Referenced Objects 
When an object references another object, any changes made to the referenced object are reflected in all references to it.
Example: 
address.street = "456 Elm St";
console.log(person.homeAddress.street); // Output: 456 Elm StAfter changing the street property of the address object, the change is visible when accessing the street property through the person object's homeAddress property. This demonstrates that the person object's homeAddress property and the address variable both reference the same object in memory.
Passing Objects to Functions 
Objects can also be passed to functions. When you pass an object to a function, you are passing a reference to it. This means that if the function modifies the object, the changes will be visible outside the function.
Example: 
function updateCity(personObj, newCity) {
    personObj.homeAddress.city = newCity;
}
updateCity(person, "Newtown");
console.log(person.homeAddress.city); // Output: NewtownIn this case, the updateCity function modifies the city property of the homeAddress object referenced by the person object passed to it. The change is reflected in the person object outside the function.
Deep Copying 
If you need to create a separate copy of an object so that changes to the new object do not affect the original, you must perform a "deep copy." This process involves copying the object and all objects it references recursively.
JavaScript does not have a built-in deep copy function, but you can achieve a deep copy using various techniques, such as using the JSON.stringify() and JSON.parse() methods for objects without methods or circular references:
const personCopy = JSON.parse(JSON.stringify(person));
personCopy.homeAddress.city = "Oldtown";
console.log(person.homeAddress.city); // Output: Newtown
console.log(personCopy.homeAddress.city); // Output: OldtownThis method converts the person object to a JSON string and then parses that string back into a new object. The result is a deep copy of person that does not reference any of the original object's nested objects. However, note that this method does not work for objects containing methods, functions, or circular references.
Conclusion 
Object references allow for the creation of complex data structures where objects can contain or reference other objects. This feature is powerful for modeling real-world relationships in your applications. Understanding how to work with object references, manipulate referenced objects, and manage object copying is crucial for effective JavaScript programming.