[[Prototype]]
이라는 숨겨진 링크를 가짐[[Prototype]]
은 객체가 상속하는 부모 객체를 가르킴 => 객체 간에 메서드와 속성 공유 prototype
이라는 속성 가짐Person
이 있을 때 Person.prototype
은 Person
으로 만들어진 모든 인스턴스의 부모가 된다.🔎 클래스란?
프로토타입을 쉽게 사용하기 위한 Sugar Syntax
class Person {
constructor(name, age) { // 생성자 함수는 필수 아님
this.name = name;
this.age = age;
}
getInfo() {
console.log(`${this.name} ${this.age}`);
}
}
const person = new Person("영희", 30);
console.log(person);
클래스로 인스턴스를 생성할 때 생성자 함수거 아님에도 클래스명.prototype
이 있다.
왜 있지...?
자바스크립트 엔진이 자동으로 constructor라는 생성자 함수를 정의하기 때문에
클래스로 정의하면 자바스크립트는 내부적으로 함수로 취급하고 이에 따라 프로토타입 속성을 갖게 된다.
super()
를 호출해야 한다.class Rectangle extends Shape {
constructor() {
super();
}
getArea() { ... }
}
class MathUtils {
static PI = 3.14;
static add(n1, n2) {
return n1 + n2;
};
static sub(n1, n2) {
return n1 - n2;
};
};
const math = new MathUtils();
const sum = math.add(10, 5); // 에러
const sum = MathUtils.add(10, 5); // 이렇게 호출해야 함
get
: 프로퍼티를 부르는 것처럼 호출set
: 프로퍼티에 값을 대입하는 것처럼 호출class Car {
constructor(speed) {
this._speed = speed;
}
set speed(value) {
this._speed = value < 0 ? 0 : value;
}
get speed() {
return this._speed
}
}
const car = new Car(200);
car.speed = -100; // 0으로 설정
console.log(car.speed);
큰 차이가 없기는 한데 이렇게도 쓰인다.
class Car {
constructor(speed) {
this.speed = speed; // 이러면 set speed가 호출된다.
}
set speed(value) {
this._speed = value < 0 ? 0 : value;
}
get speed() {
return this._speed;
}
}
const car = new Car(200);
car.speed = -100; // 0으로 설정
console.log(car.speed);
주의점은 필드명과 메서드명이 동일하면 안된다는 것! 무한루프 돌 수 있음
#
으로 시작하면 외부에서 접근이 불가능함class Car {
#speed = 0;
constructor(speed) {
this.#speed = speed;
}
set speed(value) {
this.#speed = value < 0 ? 0 : value;
}
get speed() {
return this.#speed;
}
}
const car = new Car(100);
console.log(car.#speed); // 에러
class Animal {
sound() {
console.log("sound!");
}
}
class Dog extends Animal {
run() {
console.log("run!");
}
sound() {
super.sound(); // 이렇게도 가능
console.log("Hey");
}
}
const dog = new Dog();
dog.run();
dog.sound();
function Person() {}
const person = new Person();
console.log(person instanceof Person); // true
console.dir(Person.prototype instanceof Object); // true
console.dir(person.prototype instanceof Object); // false
🔎 일급 객체란?
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체
다른 객체들에 일반적으로 적용 가능한 연산?
솔직히 정의를 보고 무슨 뜻인지 한 번에 이해되지 않았다.
이 말을 쉽게 풀어보겠다.
자바스크립트에는 다양한 객체들이 있다. A 객체도 있고 B 객체도 있고 ~
그리고 각 객체마다 적용 가능한 연산들이 있다.
일급 객체는 각 객체마다 적용 가능한 연산들을 받아들일 수 있는 객체,
그리고 이러한 연산이 다른 객체와 동일하게 사용될 수 있는 객체를 의미한다.
const sum = function() {};
function greet(callback) {
callback();
}
greet(() => {
console.log("hello");
});
function outer() {
return function() {
console.log("inner");
};
}
const fn = outer();
fn();
const dynamicFunc = new Function("name", "return '안녕하세요, ' + name");
console.log(dynamicFunc("기수"));