# 객체 ```javascript let obj = {}; // 또는 let obj = new Object(); obj.age = 14; obj.name = "Charlie"; console.log(obj.name); // C언어의 구조체 스타일 console.log(obj['name']); // PHP의 연관 배열 스타일 ``` ## 객체의 프로퍼티 나열 ```javascript for (let key in obj) { console.log(key); } for (let key of Object.keys(obj)) { console.log(key); } for (let key of Object.getOwnPropertyNames(obj)) { console.log(key); } ``` ## 생성자 함수 ```javascript function Person(name, age) { this.name = name; this.age = age; } let charlie = new Person("Charlie", 14); ``` ### Object.create() ```javascript let Point = { x: 0, y: 0, toString: function () { return "(" + this.x + ", " + this.y + ")"; } }; let point1 = Object.create(Point); console.log(point1.toString()); ``` ## 프로토타입을 통한 프로퍼티 정의 ```prototype```을 통해서 프로퍼티를 추가하면, 하나의 인스턴스에만 추가된는 것이 아니라 해당 객체의 모든 인스턴스에 프로퍼티가 추가된다. ```javascript Person.prototype.gender = "Male"; ``` ## 프로퍼티의 삭제 상속받지 않은 속성은 delete 연산자로 제거할 수 있습니다. ## 프로토타입 기반 자바나 C++과 같은 클래스 기반의 언어와는 달리 자바스크립트는 프로토타입 기반의 언어입니다. 프로토타입 기반 언어의 특징 상 클래스와 인스턴스의 구분이 모호해집니다. ```javascript function Animal(name) { this.name = name; } function Dog(name) { // Animal을 상속 Animal.call(this, name); this.bark = function () { console.log("멍멍"); }; } Dog.prototype = Object.create(Animal.prototype); let snoopy = new Dog("Snoopy"); console.log(snoopy.name); snoopy.bark(); ``` ## 객체 속성의 해체 ```javascript let person = { name: "Charlie", age: 14 }; let { name, age } = person; console.log(name); console.log(age); ``` # 클래스 난해한 프로토타입 기반의 객체 대신 클래스 기반으로 클래스를 정의할 수도 있습니다. ```javascript class Animal { constructor(name) { // 생성자 this.name = name; } static someStaticMethod() { } } class Dog extends Animal { // 확장 constructor(name) { super(name); // 부모 생성자 호출 } } let snoopy = new Dog("Snoopy"); console.log(snoopy.name); ``` # JSON 자바스크립트 객체와 문자열을 서로 변환할 수 있습니다. ```javascript JSON.parse(str) JSON.stringfy(obj) ```