객체(object)

key와 value로 이루어진 프로퍼티의 집합

// 생성자 함수로 만들었기 때문에 strig타입 아닌 object 이다
var pp = new String ('아아')
console.log(typeof(pp)) // object
----------------------------------
// 
var pp = String ('아아')
console.log(typeof(pp)) // string

생성자 함수

// 생성자 함수
function Person(name, gender) {
  var married = true;         // private
  this.name = name;           // public
  this.gender = gender;       // public
  this.sayHello = function(){ // public
    console.log('Hi! My name is ' + this.name);
  };
}

var person = new Person('Lee', 'male');

console.log(typeof person); // object
console.log(person); // Person { name: 'Lee', gender: 'male', sayHello: [Function] }

console.log(person.gender);  // 'male'
console.log(person.married); // undefined

// 함수 내에서 선언된 변수는 외부에서 참조가 불가능하지만 this 값은 외부에서 참조가 가능하다

프로퍼티 값 읽기

ex)

var person = {
  'first-name': 'Ung-mo',
  'last-name': 'Lee',
  gender: 'male',
  1: 10
};

console.log(person);

console.log(person.first-name);    // NaN: undefined-undefined
console.log(person[first-name]);   // ReferenceError: first is not defined
console.log(person['first-name']); // 'Ung-mo'

console.log(person.gender);    // 'male'
console.log(person[gender]);   // ReferenceError: gender is not defined
console.log(person['gender']); // 'male'

console.log(person['1']); // 10
console.log(person[1]);   // 10 : person[1] -> person['1']
console.log(person.1);    // SyntaxError

객체와 변가불가성

var user = {
  name: 'Lee',
  address: {
    city: 'Seoul'
  }
};

var myName = user.name; // 변수 myName은 string 타입이다.

user.name = 'Kim';
console.log(myName); // Lee

myName = user.name;  // 재할당
console.log(myName); // Kim

/* 객체를 참조하면 값이 같이 변경이 되지만 객체 안에 있는 원시타입을 
참조할 경우 pass by value로 인해 복사가 된다 */
var user1 = {
  name: 'Lee',
  address: {
    city: 'Seoul'
  }
};

var user2 = user1; // 변수 user2는 객체 타입이다.

user2.name = 'Kim';

console.log(user1.name); // Kim
console.log(user2.name); // Kim

//객체 자체를 참조할 경우 pass by reference