-
[JavaScript]프로토타입-3JavaScript 2023. 1. 12. 17:06728x90
직접 상속
Object.create에 의한 직접 상속
Object.create(~~)는 ~~를 프로토타입으로 하는 객체를 만들라는 명령어 입니다.
// 프로토타입이 null인 객체를 생성한다. 생성된 객체는 프로토타입 체인의 종점에 위치한다. // obj → null let obj = Object.create(null); console.log(Object.getPrototypeOf(obj) === null); // true // Object.prototype을 상속받지 못한다. console.log(obj.toString()); // TypeError: obj.toString is not a function // obj → Object.prototype → null // obj = {};와 동일하다. obj = Object.create(Object.prototype); console.log(Object.getPrototypeOf(obj) === Object.prototype); // true // obj → Object.prototype → null // obj = { x: 1 };와 동일하다. obj = Object.create(Object.prototype, { x: { value: 1, writable: true, enumerable: true, configurable: true } }); // 위 코드는 다음과 동일하다. // obj = Object.create(Object.prototype); // obj.x = 1; console.log(obj.x); // 1 console.log(Object.getPrototypeOf(obj) === Object.prototype); // true const myProto = { x: 10 }; // 임의의 객체를 직접 상속받는다. // obj → myProto → Object.prototype → null obj = Object.create(myProto); console.log(obj.x); // 10 console.log(Object.getPrototypeOf(obj) === myProto); // true // 생성자 함수 function Person(name) { this.name = name; } // obj → Person.prototype → Object.prototype → null // obj = new Person('Lee')와 동일하다. obj = Object.create(Person.prototype); obj.name = 'Lee'; console.log(obj.name); // Lee console.log(Object.getPrototypeOf(obj) === Person.prototype); // true
이 방식의 장점으로는
- new 연산자가 없어도 객체를 생성할 수 있다.
- 프로토타입을 지정하면서 객체를 생성할 수 있다.
- 객체 리터럴에 의해 생성된 객체도 상속받을 수 있다.
정적 프로퍼티/메서드
정적 프로퍼티/메서드는 프로토타입 체인으로 접근할 수 없고 직접 접근만 가능합니다.
// 생성자 함수 function Person(name) { this.name = name; } // 프로토타입 메서드 Person.prototype.sayHello = function () { console.log(`Hi! My name is ${this.name}`); }; // 정적 프로퍼티 Person.staticProp = 'static prop'; // 정적 메서드 Person.staticMethod = function () { console.log('staticMethod'); }; const me = new Person('Lee'); // 생성자 함수에 추가한 정적 프로퍼티/메서드는 생성자 함수로 참조/호출한다. Person.staticMethod(); // staticMethod // 정적 프로퍼티/메서드는 생성자 함수가 생성한 인스턴스로 참조/호출할 수 없다. // 인스턴스로 참조/호출할 수 있는 프로퍼티/메서드는 프로토타입 체인 상에 존재해야 한다. me.staticMethod(); // TypeError: me.staticMethod is not a function
프로퍼티 존재 확인
in 연산자
in 연산자는 객체 내에 특정 프로퍼티가 존재하는지 여부를 확인합니다.
const person = { name: 'Lee', address: 'Seoul' }; // person 객체에 name 프로퍼티가 존재한다. console.log('name' in person); // true // person 객체에 address 프로퍼티가 존재한다. console.log('address' in person); // true // person 객체에 age 프로퍼티가 존재하지 않는다. console.log('age' in person); // false
in 연산자는 프로토타입 체이닝을 통해 존재 여부를 확인합니다.
console.log('toString' in person); // true
Object.prototype.hasOwnProperty 메서드
in 연산자와의 차이는 프로토타입 체이닝을 통해 확인하지 않고 고유 프로퍼티만 확인합니다.
프로퍼티 열거
for…in 문
for…in문은 객체의 프로토타입 체인 상에 존재하는 모든 프로토타입의 프로퍼티 중에서 프로퍼티 어트리뷰트 [[Enumerable]]의 값이 true인 프로퍼티를 순회하며 열거합니다.
for…in문은 열거할 때 순서를 보장하지 않습니다.
Object.keys/values/entries 메서드
Object.keys 메서드는 개체 자신의 열거 가능한 프로퍼티 키를 배열로 반환합니다.
const person = { name: 'Lee', address: 'Seoul', __proto__: { age: 20 } }; console.log(Object.keys(person)); // ["name", "address"]
Object.values 메서드는 객체 자신의 열거 가능한 프로퍼티 값을 배열로 반환합니다.
console.log(Object.values(person)); // ["Lee", "Seoul"]
Object.entries 메서드는 객체 자신의 열거 가능한 프로퍼티 키와 값의 쌍의 배열을 배열에 담아 반환합니다.
console.log(Object.entries(person)); // [["name", "Lee"], ["address", "Seoul"]] Object.entries(person).forEach(([key, value]) => console.log(key, value)); /* name Lee address Seoul */
728x90'JavaScript' 카테고리의 다른 글
[JavaScript]프로토타입-2 (0) 2023.01.05 [JavaScrip] 프로토타입 - 1 (0) 2023.01.03 [JavaScrip] 함수와 일급 객체 (0) 2022.11.24 [JavaScript] 생성자 함수에 의한 객체 생성 (0) 2022.11.23 [백준]1132 : 합(javascript) (0) 2022.07.25