2차_3주차_방성준_회고록 - hyeone999/Docs-JS_deepDive_Study GitHub Wiki

3주차 회고록

프로토타입

자바스크립트는 명령형, 함수형, 프로토타입 기반 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어다.
function Circle(radius) {
    this.radius = radius;
}

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

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

console.log(circle1.getArea === circle2.getArea); // true

console.log(circle1.getArea()); // 3.141592653589793
console.log(circle2.getArea()); // 12.566370614359172
프로토타입 기반 상속 구현
Circle 생성자 함수가 생성한 모든 인스턴스는 자신의 프로토타입, 즉 상위 객체 역할을 하는 Circle.prototype의 모든 프로퍼티와 메서드를 상속받는다.

프로토타입 객체

프로토타입 객체란 객체지향 프로그래밍의 근간을 이루는 객체 간 상속을 구현하기 위해 사용된다. 프로토타입은 어떤 객체의 상위 객체의 역할을 하는 객체로서 다른 객체에 공유 프로퍼티를 제공한다. 프로토타입을 상속받은 하위 객체는 상위 객체의 프로퍼티를 자신의 프로퍼티처럼 자유롭게 사용할 수 있다.

proto 접근자 프로퍼티

모든 객체는 proto 접근자 프로퍼티를 통해 자신의 프로토타입. 즉 Prototype 내부 슬롯에 간접적으로 접근할 수 있다.

프로토타입의 생성 시점

프로토타입은 생성자 함수가 생성되는 시점에 더불어 생성된다.

객체 생성 방식과 프로토타입의 결정

객체는 여러가지 생성 방법이 있다.
객체 리터럴, Object 생성자 함수, 생성자 함수, Object.create 메서드, 클래스
각 방식마다 세부적인 객체 생성 방식에는 차이가 있지만, 추상 연산 OrdinaryObjectCreate에 의해 생성된다는 공통점이 있다.

객체 리터럴에 의해 생성된 객체의 프로토타입

const obj = { x:1 };

console.log(obj.constructor === Object); // true
console.log(obj.hasOwnProperty('x')); // true

객체 리터럴 내부에서 __proto__에 의한 직접 상속

const myProto = { x:10 };

const obj = {
    y : 20,
    __proto__ : myProto
};

console.log(obj.x, obj.y); // 10 20
console.log(Object.getPrototypeOf(obj) === myProto); // true

Number

Number 생성자 함수

const numObj = new Number();
console.log(numObj); // [Number: 0]

Number.EPSILON

Number.EPSILON은 1과 1보다 큰 숫자 중에서 가장 작은 숫자와의 차이와 같다.
0.1 + 0.2; // 0.30000000000000004
0.1 + 0.2 === 0.3 // -> false
이때 Nunber.EPSILON은 부동 소수점으로 인해 발생하는 오차를 해결해준다
function isEqual(a,b) {
    return Math.abs(a - b) < Number.EPSILON;
}

isEqual(0.1 + 0.2, 0.3); // -> true
웬만하면 부동 소수점을 비교하는 일은 없는게 좋다.

기술블로그

프로토타입
Number