ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JavaScript]프로토타입-3
    JavaScript 2023. 1. 12. 17:06
    728x90

    직접 상속

    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

    댓글

Designed by Tistory.