μλ°μ€ν¬λ¦½νΈ νλ‘ν νμ 체μΈμ μλ°μ€ν¬λ¦½νΈμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ ν΅μ¬μ μΈ κ°λ μ λλ€. μ΄ κΈμμλ μλ°μ€ν¬λ¦½νΈ μ΄λ³΄μλ μ½κ² μ΄ν΄ν μ μλλ‘ νλ‘ν νμ 체μΈμ λν΄ μμΈν μ€λͺ νκ² μ΅λλ€.
β£ λͺ©μ°¨
μλ°μ€ν¬λ¦½νΈ κ°μ²΄μ λν λ΄μ©μ μλ ν¬μ€ν
μ μ°Έκ³ ν΄ μ£ΌμΈμπ
01. νλ‘ν νμ μ κ°λ μ΄ν΄νκΈ°π
νλ‘ν νμ μ΄λ 무μμΈκ°
νλ‘ν νμ (prototype)μ μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ꡬννλ λ° μ€μν μν μ ν©λλ€. λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ νλ‘ν νμ μ΄λΌλ μ¨κ²¨μ§ μμ±μ κ°μ§κ³ μμΌλ©°, μ΄ μμ±μ λ€λ₯Έ κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€. μ΄ μ°Έμ‘°λ κ°μ²΄λ ν΄λΉ κ°μ²΄μ νλ‘ν νμ μΌλ‘ λΆλ¦¬λ©°, νλ‘ν νμ κ°μ²΄λ μμ±κ³Ό λ©μλλ₯Ό ν¬ν¨ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ κ°μ²΄λ νλ‘ν νμ μΌλ‘λΆν° μμ±κ³Ό λ©μλλ₯Ό μμλ°μ μ μμ΅λλ€.
μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄ μμ±κ³Ό νλ‘ν νμ μ κ΄κ³
λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ μμ μ νλ‘ν νμ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ΄λΆ λ§ν¬λ₯Ό κ°μ§κ³ μμ΅λλ€. μλ₯Ό λ€μ΄, function Person() {}μ κ°μ μμ±μ ν¨μλ₯Ό μ¬μ©νλ©΄, μ΄ ν¨μμ prototype μμ±μ΄ μλ‘μ΄ κ°μ²΄μ νλ‘ν νμ μ΄ λ©λλ€.
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}`);
};
const alice = new Person('Alice');
alice.greet(); // "Hello, my name is Alice"
νλ‘ν νμ κ³Ό proto μ°¨μ΄μ
__proto__λ κ°μ²΄ κ°μ μμ κ΄κ³λ₯Ό λνλ΄λ©°, prototypeμ ν¨μ κ°μ²΄κ° μμ±ν κ°μ²΄μ κΈ°λ³Έ ꡬ쑰(νλ‘ν νμ )λ₯Ό μ μνλ λ° μ¬μ©λ©λλ€.
const exampleObj = {};
// __proto__λ λͺ¨λ κ°μ²΄μ μ‘΄μ¬νλ©°, μμμμ λΆλͺ¨ κ°μ²΄λ₯Ό κ°λ¦¬ν΅λλ€.
console.log(exampleObj.__proto__);
function Person(name, age) {
this.name = name;
this.age = age;
}
console.log(Person.prototype);
νλ‘ν νμ μ κΈ°λ³Έ ꡬ쑰
λͺ¨λ ν¨μ κ°μ²΄λ prototype νλ‘νΌν°λ₯Ό κ°μ§κ³ μμΌλ©°, μ΄λ₯Ό ν΅ν΄ μμ±λλ κ°μ²΄λ μ΄ νλ‘ν νμ μ μμλ°μ΅λλ€.
function Animal(type) {
this.type = type;
}
console.log(Animal.prototype); // {}
console.log(Animal.prototype.constructor === Animal); // true
const dog = new Animal("Dog");
console.log(dog.__proto__); // Animal.prototype
console.log(dog.__proto__ === Animal.prototype); // true
02. νλ‘ν νμ 체μΈμ΄λ?π
νλ‘ν νμ 체μΈμ μ μ
νλ‘ν νμ 체μΈμ΄λ κ°μ²΄κ° μμ μ νλ‘ν νμ μ ν΅ν΄ λ€λ₯Έ κ°μ²΄μ μμ±κ³Ό λ©μλλ₯Ό μμλ°λ ꡬ쑰λ₯Ό λ§ν©λλ€. μ΄λ μλ°μ€ν¬λ¦½νΈμ μμ λ©μ»€λμ¦μ μ΄ν΄νλ λ° λ§€μ° μ€μν©λλ€.
νλ‘ν νμ 체μΈμ λμ
μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄μ νλ‘νΌν°λ λ©μλμ μ κ·Όν λ, ν΄λΉ κ°μ²΄μ μ‘΄μ¬νμ§ μμΌλ©΄ νλ‘ν νμ 체μΈμ λ°λΌκ°λ©° μμ νλ‘ν νμ κ°μ²΄μμ ν΄λΉ νλ‘νΌν°λ₯Ό μ°Ύμ΅λλ€. μ΅μμμλ Object.prototypeμ΄ μμΌλ©°, μ¬κΈ°μλ μ°Ύμ μ μμΌλ©΄ undefinedλ₯Ό λ°νν©λλ€.
const testObj = {};
console.log(testObj.__proto__); // Object.prototype
function Student(name, year) {
this.name = name;
this.year = year;
}
console.log(Student.prototype); // Student {}
const alice = new Student('Alice', 2003);
console.log(alice.__proto__ === Student.prototype); // true
μΈμ€ν΄μ€ λ©μλμ νλ‘ν νμ λ©μλμ μ°¨μ΄
μΈμ€ν΄μ€λ§λ€ λ©μλλ₯Ό μ μνλ©΄ λ©λͺ¨λ¦¬ λλΉκ° λ°μν μ μμ΅λλ€. μ΄λ₯Ό νΌνκΈ° μν΄ νλ‘ν νμ μ λ©μλλ₯Ό μ μνλ κ²μ΄ μ’μ΅λλ€. νλ‘ν νμ λ©μλλ κ°μ²΄μ νλ‘ν νμ (prototype)μ μ μλ λ©μλμ λλ€. μ΄ λ©μλλ€μ λͺ¨λ ν΄λΉ κ°μ²΄μ μΈμ€ν΄μ€μμ 곡μ λ©λλ€. μ¦, λͺ¨λ κ°μ²΄ μΈμ€ν΄μ€κ° λμΌν λ©μλ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νκ² λ©λλ€.
function Car(make, model) {
this.make = make;
this.model = model;
this.start = function () {
return `${this.make} ${this.model} is starting!`;
};
}
const car1 = new Car("Toyota", "Corolla");
const car2 = new Car("Honda", "Civic");
console.log(car1.start()); // "Toyota Corolla is starting!"
console.log(car2.start()); // "Honda Civic is starting!"
console.log(car1.start === car2.start); // false
μμ κ°μ λ°©μμ λ©λͺ¨λ¦¬λ₯Ό λλΉνκ² λ©λλ€. μ΄λ₯Ό κ°μ νλ €λ©΄ νλ‘ν νμ μ λ©μλλ₯Ό μ μν©λλ€.
function Car(make, model) {
this.make = make;
this.model = model;
}
Car.prototype.start = function () {
return `${this.make} ${this.model} is starting!`;
};
const car1 = new Car("Toyota", "Corolla");
const car2 = new Car("Honda", "Civic");
console.log(car1.start()); // "Toyota Corolla is starting!"
console.log(car2.start()); // "Honda Civic is starting!"
console.log(car1.start === car2.start); // true
μ΄ κ²½μ°, start λ©μλλ λͺ¨λ Car μΈμ€ν΄μ€κ° 곡μ νκ² λμ΄ λ©λͺ¨λ¦¬ ν¨μ¨μ΄ κ°μ λ©λλ€.
λ©μλ μ€λ²λΌμ΄λ©κ³Ό νλ‘νΌν° μλμ
- λ©μλ μ€λ²λΌμ΄λ©: μμ κ΄κ³μμ μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ λμΌν μ΄λ¦μ λ©μλλ₯Ό μ¬μ μ(override)νλ κ²μ λ§ν©λλ€. μ΄λ₯Ό ν΅ν΄ μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ λμμ λ³κ²½νκ±°λ νμ₯ν μ μμ΅λλ€. μλ°μ€ν¬λ¦½νΈμμλ νλ‘ν νμ
체μΈμ μ΄μ©νμ¬ λ©μλ μ€λ²λΌμ΄λ©μ ꡬνν©λλ€.
- νλ‘νΌν° μλμ: νλ‘νΌν° μλμμ μμ κ΄κ³μμ μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ νλ‘νΌν°μ λμΌν μ΄λ¦μ νλ‘νΌν°λ₯Ό μ μνλ κ²μ λ§ν©λλ€. μ΄λ, μμ ν΄λμ€μ νλ‘νΌν°κ° λΆλͺ¨ ν΄λμ€μ νλ‘νΌν°λ₯Ό "κ°λ¦¬κ²" λμ΄, λΆλͺ¨ ν΄λμ€μ νλ‘νΌν°μ μ§μ μ κ·Όν μ μκ² λ©λλ€.
μλ°μ€ν¬λ¦½νΈμμλ μΈμ€ν΄μ€ λ©μλκ° νλ‘ν νμ λ©μλλ³΄λ€ μ°μ μλ©λλ€.
function Bird(type) {
this.type = type;
this.fly = function () {
return "Flying!";
};
}
Bird.prototype.fly = function () {
return "Soaring in the sky!";
};
const eagle = new Bird("Eagle");
console.log(eagle.fly()); // "Flying!" - μΈμ€ν΄μ€ λ©μλκ° μ°μ μλ©λλ€.
μ μμ μμ eagle κ°μ²΄λ μΈμ€ν΄μ€ λ©μλλ‘ μ μλ fly λ©μλλ₯Ό μ¬μ©ν©λλ€. νλ‘ν νμ μ μ μλ fly λ©μλλ 무μλ©λλ€.
getPrototypeOfμ setPrototypeOf μ¬μ©νκΈ°
Object.getPrototypeOfμ Object.setPrototypeOf λ©μλλ₯Ό μ¬μ©νμ¬ νλ‘ν νμ μ μ‘°ννκ³ λ³κ²½ν μ μμ΅λλ€.
function Vehicle(type) {
this.type = type;
}
Vehicle.prototype.drive = function () {
return `${this.type} is driving!`;
};
function Bike(type) {
this.type = type;
}
const myVehicle = new Vehicle("Car");
const myBike = new Bike("Mountain Bike");
console.log(Object.getPrototypeOf(myBike) === Bike.prototype); // true
Object.setPrototypeOf(myBike, Vehicle.prototype);
console.log(myBike.drive()); // "Mountain Bike is driving!"
03. νλ‘ν νμ 체μΈμ νμ© λ°©λ²π οΈ
νλ‘ν νμ
체μΈμ μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ꡬννλ μ€μν λꡬμ
λλ€. μ΄λ₯Ό νμ©νμ¬ κ°μ²΄μ μμ, λ©μλ 곡μ , μ½λ μ¬μ¬μ©μ±μ λμΌ μ μμ΅λλ€. νλ‘ν νμ
체μΈμ ν¨κ³Όμ μΌλ‘ νμ©νλ λ°©λ²μ λͺ κ°μ§ μκ°ν©λλ€.
μλ°μ€ν¬λ¦½νΈ μμμ κ΄ν λ΄μ©μ μλ ν¬μ€ν
μ μ°Έκ³ ν΄ μ£ΌμΈμπ
1. νλ‘ν νμ μ μ΄μ©ν μμ
νλ‘ν νμ 체μΈμ νμ©νμ¬ κ°μ²΄ κ°μ μμμ ꡬνν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ½λ μ¬μ¬μ©μ±μ λμ΄κ³ , κ°μ²΄ κ°μ κ΄κ³λ₯Ό λͺ ννκ² μ μν μ μμ΅λλ€.
μμ : μμ ꡬν
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name} makes a noise.`);
};
function Dog(name, breed) {
Animal.call(this, name);
this.breed = breed;
}
// Dogμ νλ‘ν νμ
μ Animalμ νλ‘ν νμ
μΌλ‘ μ€μ
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
console.log(`${this.name} barks.`);
};
const rex = new Dog('Rex', 'German Shepherd');
rex.speak(); // "Rex makes a noise."
rex.bark(); // "Rex barks."
2. λ©μλ 곡μ λ₯Ό ν΅ν λ©λͺ¨λ¦¬ μ μ½
νλ‘ν νμ 체μΈμ μ΄μ©νλ©΄ κ° κ°μ²΄ μΈμ€ν΄μ€λ§λ€ λ©μλλ₯Ό μ€λ³΅ μ μνμ§ μκ³ λ λ©μλλ₯Ό 곡μ ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬λ₯Ό μ μ½ν μ μμ΅λλ€.
μμ : λ©μλ 곡μ
function Car(make, model) {
this.make = make;
this.model = model;
}
Car.prototype.start = function() {
console.log(`${this.make} ${this.model} is starting!`);
};
const car1 = new Car("Toyota", "Corolla");
const car2 = new Car("Honda", "Civic");
console.log(car1.start === car2.start); // true
car1.start(); // "Toyota Corolla is starting!"
car2.start(); // "Honda Civic is starting!"
3. κ°μ²΄ 쑰립(Composition) ν¨ν΄
μμλ³΄λ€ κ°μ²΄ 쑰립(Composition) ν¨ν΄μ μ¬μ©ν μλ μμ΅λλ€. μ΄ ν¨ν΄μμλ μμ κΈ°λ₯ λ¨μμ κ°μ²΄λ€μ 쑰립νμ¬ λ 볡μ‘ν κ°μ²΄λ₯Ό μμ±ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ μ°νκ³ μ¬μ¬μ© κ°λ₯ν μ½λ ꡬ쑰λ₯Ό λ§λ€ μ μμ΅λλ€.
μμ : κ°μ²΄ 쑰립
const canEat = {
eat() {
console.log(`${this.name} is eating.`);
}
};
const canWalk = {
walk() {
console.log(`${this.name} is walking.`);
}
};
function Person(name) {
this.name = name;
}
Object.assign(Person.prototype, canEat, canWalk);
const john = new Person('John');
john.eat(); // "John is eating."
john.walk(); // "John is walking."
4. νλ‘ν νμ 체μΈμ ν΅ν λ©μλ μ€λ²λΌμ΄λ©
νλ‘ν νμ 체μΈμ μ΄μ©νμ¬ μμ κ°μ²΄μμ λΆλͺ¨ κ°μ²΄μ λ©μλλ₯Ό μ€λ²λΌμ΄λν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ κ°μ²΄μ λμμ μ¬μ μν μ μμ΅λλ€.
μμ : λ©μλ μ€λ²λΌμ΄λ©
function Bird(type) {
this.type = type;
}
Bird.prototype.fly = function() {
console.log(`${this.type} is flying.`);
};
function Eagle(type) {
Bird.call(this, type);
}
Eagle.prototype = Object.create(Bird.prototype);
Eagle.prototype.constructor = Eagle;
Eagle.prototype.fly = function() {
console.log(`${this.type} is soaring high.`);
};
const myEagle = new Eagle('Eagle');
myEagle.fly(); // "Eagle is soaring high."
5. ES6 ν΄λμ€ λ¬Έλ² νμ©
ES6 ν΄λμ€ λ¬Έλ²μ νλ‘ν νμ 체μΈμ λ³΄λ€ μ§κ΄μ μΌλ‘ μ¬μ©ν μ μλλ‘ λμμ€λλ€. μ΄λ₯Ό ν΅ν΄ ν΄λμ€λ₯Ό μ μνκ³ μμ ꡬ쑰λ₯Ό μ½κ² ꡬνν μ μμ΅λλ€.
μμ : ES6 ν΄λμ€
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
bark() {
console.log(`${this.name} barks.`);
}
}
const rex = new Dog('Rex', 'German Shepherd');
rex.speak(); // "Rex makes a noise."
rex.bark(); // "Rex barks."
μλ°μ€ν¬λ¦½νΈ ν΄λμ€μ κ΄ν λ΄μ©μ μλ ν¬μ€ν
μ μ°Έκ³ ν΄ μ£ΌμΈμπ
04. νλ‘ν νμ 체μΈμ λ¬Έμ μ λ° ν΄κ²° λ°©λ²π§
λ¬Έμ μ
1. μ±λ₯ λ¬Έμ : νλ‘ν νμ 체μΈμ ν΅ν΄ μμλ μμ±μ΄λ λ©μλλ₯Ό μ κ·Όν λ, 체μΈμ΄ κΈΈμ΄μ§μλ‘ μμ±μ μ°ΎκΈ° μν΄ λ§μ μκ°μ΄ μμλ μ μμ΅λλ€. νΉν, 체μΈμ΄ κΉμμλ‘ μ΄λ¬ν λ¬Έμ κ° μ¬νλ©λλ€.
2. μμ ꡬ쑰μ 볡μ‘μ±: νλ‘ν νμ
체μΈμ νμ©ν λ€μ€ μμμ΄λ 볡μ‘ν μμ ꡬ쑰λ μ½λμ κ°λ
μ±μ λ¨μ΄λ¨λ¦¬κ³ , μ μ§λ³΄μλ₯Ό μ΄λ ΅κ² λ§λλλ€. μμ κ³μΈ΅μ΄ κΉμ΄μ§μλ‘ λλ²κΉ
μ΄ μ΄λ €μμ§ μ μμ΅λλ€.
3. κ°μ²΄ 곡μ λ¬Έμ : νλ‘ν νμ
체μΈμ ν΅ν΄ μμλ κ°μ²΄μ μμ±μ΄ μ°Έμ‘° νμ
(μ: λ°°μ΄, κ°μ²΄)μΈ κ²½μ°, λͺ¨λ μΈμ€ν΄μ€κ° κ°μ μ°Έμ‘°λ₯Ό 곡μ νκ² λμ΄ μκΈ°μΉ μμ λ²κ·Έκ° λ°μν μ μμ΅λλ€.
4. νλ‘ν νμ
체μΈμ λμ νΉμ±: νλ‘ν νμ
체μΈμ λμ μΌλ‘ λ³κ²½λ μ μμ΄, μλμΉ μκ² νλ‘ν νμ
μ΄ λ³κ²½λλ©΄ μκΈ°μΉ μμ λμμ΄ λ°μν μ μμ΅λλ€.
ν΄κ²° λ°©λ²
1. ES6 ν΄λμ€ μ¬μ©: ES6μμ λμ λ class λ¬Έλ²μ μ¬μ©νλ©΄ λ μ§κ΄μ μ΄κ³ λͺ νν μμ ꡬ쑰λ₯Ό λ§λ€ μ μμ΅λλ€. ν΄λμ€ λ¬Έλ²μ μ¬μ©νλ©΄ νλ‘ν νμ 체μΈμ μ§μ λ€λ£¨λ κ²λ³΄λ€ κ°λ¨νκ³ , μ½λ κ°λ μ±λ ν₯μλ©λλ€.
class Parent {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
}
class Child extends Parent {
constructor(name, age) {
super(name);
this.age = age;
}
sayAge() {
console.log(`I am ${this.age} years old`);
}
}
const child = new Child('John', 25);
child.sayHello(); // Hello, my name is John
child.sayAge(); // I am 25 years old
2. κ°μ²΄ 볡μ¬: κ°μ²΄μ μμ±μ΄ μ°Έμ‘° νμ
μΌ κ²½μ°, μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν λ 볡μ¬λ³Έμ λ§λ€μ΄ κ° μΈμ€ν΄μ€κ° λ
립μ μΈ μμ±μ κ°λλ‘ ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ°Έμ‘° 곡μ λ¬Έμ λ₯Ό λ°©μ§ν μ μμ΅λλ€.
class Parent {
constructor(items) {
this.items = [...items]; // λ°°μ΄μ 볡μ¬λ³Έ μμ±
}
}
const parent1 = new Parent([1, 2, 3]);
const parent2 = new Parent([4, 5, 6]);
parent1.items.push(4);
console.log(parent1.items); // [1, 2, 3, 4]
console.log(parent2.items); // [4, 5, 6]
3. Composition over Inheritance: μμλ³΄λ€ μ»΄ν¬μ§μ
(ꡬμ±)μ νμ©νμ¬ κ°μ²΄λ₯Ό 쑰립νλ λ°©μμΌλ‘ μ½λ μ¬μ¬μ©μ±μ λμ
λλ€. μ΄λ μμμΌλ‘ μΈν 볡μ‘μ±μ μ€μ΄κ³ , μ μ°μ±μ μ¦κ°μν΅λλ€.
const sayHelloMixin = (obj) => {
obj.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
};
const sayAgeMixin = (obj) => {
obj.sayAge = function() {
console.log(`I am ${this.age} years old`);
};
};
const person = {
name: 'John',
age: 25
};
sayHelloMixin(person);
sayAgeMixin(person);
person.sayHello(); // Hello, my name is John
person.sayAge(); // I am 25 years old
4. Object.create() μ¬μ©: νΉμ κ°μ²΄λ₯Ό νλ‘ν νμ
μΌλ‘ κ°λ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν λ Object.create()λ₯Ό μ¬μ©νλ©΄ λ³΄λ€ λͺ
νν νλ‘ν νμ
체μΈμ ꡬμ±ν μ μμ΅λλ€.
const parent = {
sayHello() {
console.log('Hello');
}
};
const child = Object.create(parent);
child.sayHello(); // Hello