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
웬만하면 부동 소수점을 비교하는 일은 없는게 좋다.
기술블로그