blair's 개발 portfolio

[모던 자바스크립트 Deep Dive] 19. 프로토타입

프로토 타입

 

19. 객체지향 프로그래밍

  • 실체는 특징이나 성질을 나타내는 속성을 가지고 있고, 이를 통해 인식, 구별할 수 있다
  • 다양한 속성중에서 프로그램에 필요한 속성만 간추려 표현하는 것을 추상화라 한다
// 이름과 주소 속성을 갖는 객체

const person = {
    name: 'Lee',
    address : 'Seoul'
};

console.log(person);
 // {name: "Lee" , address: "Seoul"}

 

  • 속성을 통해 여러 개의 값을 하나의 단위로 구성한 복합적인 자료구조를 객체라 하며 객체 지향 프로그래밍은 독립적인 객체의 집합으로 프로그래밍을 표현하려는 프로그래밍 패러다임이다
  • 객체의 상태를 나타내는 데이터와 상태 데이터를 조작할 수 있는 동작을 하나의 논리적인 단위로 묶어 생각한다. = 상태 데이터와 동작을 하나의 논리적인 단위로 묶은 복합적인 자료구조라고 할 수 있다.
const circle = {
    radius : 5, 
    getDIameter(){
        return 2 * this.radius;
    },

    //원의 둘레 
    getPermeter(){
        return 2 * MathPI + this.radius;
    },
    // 원의 널이
    getArea()
    {
        return Math.PI * this.radius ** 2;
    }
}

console.log(circle);

console.log(circle.getDIameter());
console.log(circle.getPermeter());
console.log(circle.getArea());

19.2 상속과 프로토타입

  • 상속은 객체지향 프로그래미의 핵심 개념으로 어떤 객체의 프로퍼티 또는 메서드를 다른 객체가 상속받아 그대로 사용할 수 있는 것을 말한다

  • 상속을 통해 불필요한 중복을 제거, 자바스크립트는 프로토타입을 기반으로 상속을 구현한다.
// 생성자 함수
function Circle(radius) {
    this.radius = radius;
}

//circle 생성자 함수가 생성한 모든 인스턴스가 getarea 메서드를 
//공유해서 사용할 수 있도록 프로토타입에 추가한다
//프로토타입은 circle 생성자 함수의 prototype 프로퍼티에 바인딩되어 있다

Circle.prototype.getArea = function(){
    return Math.PI * this.radius ** 2;
};

//인스턴스 생성
const circle1 = new Circle(1);
const circle2 = new Circle(2);

//circle 생성자 함수가 생성한 모든 인스턴스는 부모 객체의 역할을 하는 
//프로토타입 Cicle.prototype으로부터 getArea 메서드를 상속 받는다.
// 즉 Circle 생성자 함수가 생성하는 모든 인스턴스는 하나의 getArea 메서드를 공유한다
console.log(circle1.getArea === circle2.getArea); //true

console.log(circle1.getArea());
console.log(circle2.getArea());

9.12 정적 프로퍼티/메서드

  • 정적 프로퍼티/메서드는 생성자 함수로 인스턴스를 생성하지 않아도 참조/ 호출할 수 있는 프로퍼티/메서드를 말한다
// 생성자 함수

function Person(name){
    this.name = name;
}

// 프로토타입
Person.prototype.sayHello = function(){
    console.log(`Hi! MY name is ${this.name}`);
}

// 정적 프로토타입
Person.static.Prop = 'static prop';

//정적 메서드

Person.staticMethod = function(){
    console.log('staticMethod');
};

const me = new Person('Lee');

// 생성자 함수에 추가한 정적 프로퍼티/메서드는 생성자 함수로 참조/호출된다.
Person.staticMethod();

me.staticMethod() //error
  • 생성자 함수가 생성한 인스턴스는 자신의 프로토타입 체인에 속한 객체의 프로퍼티/메서드에 접근할 수 있다
  • 하지만 정적 프로퍼티/메서드는 인스턴스의 프로토타입 체인에 속한 객체의 프로퍼티/메서드가 아니므로 인스턴스로 접근할 수 없다.
function foo(){}

// 프로토타입 메서드
// this를 참조하지 않는 프로토 타입 메서든 정적 메서드로 변경하여도 동일한 효과를 얻을 수 없다

foo.prototype.x = function(){
    console.log('x');
};

const foo = new foo();
// 프로토타입 메서드를 호출하려면 인스턴스를 생성해야 한댜.

foo.x(); //x

// 정적 메서드
foo.x = function(){
    console.log('x');
};

//정적 메서드는 인스턴스를 생성하지 않아도 호출할 수 있다.
foo.x() ;

  • 프로토타입 프로퍼티/메서드를 표기할 때 prototype을 #으로 표기하는 경우도 있다

 

19.13 프로퍼티 존재 확인

in 연산자 

  • 객체 내에 특정 프로퍼티가 존재하는지 여부를 확인한다. in 연산자의 사용법은 다음과 같다
  • key in object
  • key: 프로퍼티 키를 나타내는 문자열
  • object :  객체로 평가되는 표현식
const person = {
    name : 'Lee',
    address : 'Seoul'
};

//person 객체에 name 프로퍼티가 존재한다
console.log('name' in person); //true
//oerson 객체에 address 프로퍼티가 존재한다
console.log('address' in person); //true
//person 객체에 age 프로퍼티가 존재하지 않는다
console.log('age' in person); // false
  • Reflect.has 메서드는 in 연산자와 동일하게 동작한다
  • Object.prototype.hasOwnProperty 메서드를 사용해도 객체에 특정 프로퍼티가 존재하는지 확인할 수 있다
  • 프로퍼티 키가 객체 고유희 프로퍼티 키인 경우에만 true 아니면 false를 반환한다

19.14 프로퍼티 열거

for..in 문

  • for (변수선언문 in 객체) {...}
  • for..in 문은 객체의 프로퍼티 개수만큼 순회하며 for..in 문의 변수 선언문에서 선언한 변수에 프로퍼티키를 할당한다
  • 상속받은 프로토 타입의 프로퍼티까지 열거한다.
const person = {
    name : 'Lee',
    address : 'Seoul'
};

for(const key in person){
    console.log(key + ":" + person[key]);
}
  • for..in 문은 객체의 프로토 타입 체인 상에 존재하는 모든 프로토타입의 프로퍼티 중에서 프로퍼티 어트리뷰트[[Enumerable]]의 값이 true인 프로퍼티를 순회하며 열거한다.
  • for..in 문은 프로퍼티 키가 심벌인 프로퍼티는 열거하지 않는다.
  • Object.keys 메서드는 객체 자신의 열거 가능한 프로퍼티 키를 배열로 반환한다.
  • Object.values 메서드는 객체 자신의 열거 가능한 프로퍼티 값을 배열로 반환한다.
  • Object.entries 메서드는 객체 자신의 열거 가능한 프로퍼티 값의 쌍의 배열을 배열에 담하 반환한다.

 

블로그의 정보

개발 블로그👩‍💻

Blairj

활동하기