| μμ± λ°©λ² | λ¬Έλ² | μ€λͺ | νΉμ§ | μμ |
|---|---|---|---|---|
| κ°μ²΄ 리ν°λ΄ | {} |
μ€κ΄νΈλ₯Ό μ¬μ©νμ¬ μ§μ κ°μ²΄λ₯Ό μμ± | κ°μ₯ κ°λ¨νκ³ μΌλ°μ μΈ λ°©λ² | const person = { name: 'νκΈΈλ', age: 30 }; |
| μμ±μ ν¨μ | new Constructor() |
ν¨μλ₯Ό μ¬μ©νμ¬ κ°μ²΄ ν νλ¦Ώ μ μ | μ¬λ¬ μ μ¬ν κ°μ²΄λ₯Ό λ§λ€ λ μ μ© | function Person(name, age) { this.name = name; this.age = age; } const person = new Person('νκΈΈλ', 30); |
| Object μμ±μ | new Object() |
Object λ΄μ₯ μμ±μ μ¬μ© | 리ν°λ΄λ³΄λ€ λ μ¬μ©λ¨ | const person = new Object(); person.name = 'νκΈΈλ'; person.age = 30; |
| Object.create() | Object.create(proto) |
μ§μ λ νλ‘ν νμ κ°μ²΄μ μμ±μ κ°λ μ κ°μ²΄ μμ± | νλ‘ν νμ μμμ λͺ μμ μΌλ‘ μ§μ | const personProto = { greet() { return μλ
νμΈμ, ${this.name}μ
λλ€; } }; const person = Object.create(personProto); person.name = 'νκΈΈλ'; |
| ν΄λμ€ (ES6+) | class ... {} |
ν΄λμ€ λ¬Έλ²μΌλ‘ κ°μ²΄ ν νλ¦Ώ μ μ | μμ±μ ν¨μμ λ¬Έλ²μ μ€ν, OOP μ€νμΌ | class Person { constructor(name, age) { this.name = name; this.age = age; } greet() { return μλ
νμΈμ, ${this.name}μ
λλ€; } } const person = new Person('νκΈΈλ', 30); |
| ν©ν 리 ν¨μ | factory() |
κ°μ²΄λ₯Ό λ°ννλ μΌλ° ν¨μ | new ν€μλ μμ΄ κ°μ²΄ μμ± κ°λ₯ | function createPerson(name, age) { return { name, age, greet() { return μλ
νμΈμ, ${name}μ
λλ€; } }; } const person = createPerson('νκΈΈλ', 30); |
| Object.assign() | Object.assign({}, obj) |
νλ μ΄μμ μλ³Έ κ°μ²΄μμ λμ κ°μ²΄λ‘ μμ± λ³΅μ¬ | κ°μ²΄ 볡μ λ ν©μ±μ μ μ© | const defaults = { age: 0, gender: 'λ―Έμ§μ ' }; const person = Object.assign({}, defaults, { name: 'νκΈΈλ', age: 30 }); |
| κ°μ²΄ λΆν΄ ν λΉ (ES6+) | {...obj} |
μ€νλ λ μ°μ°μλ₯Ό μ¬μ©νμ¬ κ°μ²΄ μμ± λ³΅μ¬ | κ°κ²°ν ꡬ문μΌλ‘ κ°μ²΄ 볡μ | const defaults = { age: 0, gender: 'λ―Έμ§μ ' }; const person = { ...defaults, name: 'νκΈΈλ', age: 30 }; |
| Map κ°μ²΄ (ES6+) | new Map() |
ν€-κ° μμ μ μ₯νλ 컬λ μ | ν€κ° λ¬Έμμ΄μ΄ μλ κ°λ κ°λ₯ | const person = new Map(); person.set('name', 'νκΈΈλ'); person.set('age', 30); |
| Proxy (ES6+) | new Proxy(obj, handler) |
κ°μ²΄μ κΈ°λ³Έ λμμ μ¬μ©μ μ μ | κ°μ²΄ μμ μ€μ¬ λ° κ°λ‘μ±κΈ° κ°λ₯ | const person = new Proxy({ name: 'νκΈΈλ' }, { get(obj, prop) { return prop in obj ? obj[prop] : 'μμ±μ΄ μμ΅λλ€'; } }); |
-
λ¨μΌ κ°μ²΄ λ§λ€ λ κ°μ₯ κ°νΈνκ² μμ±ν μ μμ
-
κ°μ²΄ 리ν°λ΄μ μ€κ΄νΈ(
{})λ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μ§μ μμ±ν©λλ€. μ€κ΄νΈ μμ μμ±κ³Ό κ°μ μΌνλ‘ κ΅¬λΆνμ¬ μ μν©λλ€.const person = { name: 'νκΈΈλ', age: 30, job: 'κ°λ°μ' };
-
κ°μ²΄ 리ν°λ΄μ μ€μ²©(Nesting) κ°μ²΄ 리ν°λ΄ λ΄μ λ€λ₯Έ κ°μ²΄λ₯Ό μ€μ²©νμ¬ λ³΅μ‘ν λ°μ΄ν° ꡬ쑰λ₯Ό ννν μ μμ΅λλ€
const student = { name: 'νκΈΈλ', age: 20, grades: { math: 95, science: 88, language: 92 }, address: { city: 'μμΈ', district: 'κ°λ¨κ΅¬', details: { street: 'ν ν€λλ‘', building: '123λ' } } }; // μ€μ²©λ μμ±μ μ κ·Ό console.log(student.grades.math); // 95 console.log(student.address.details.street); // 'ν ν€λλ‘'
- μ΄ λ κ°μ²΄μμ μ€μ²©λ κ°μ²΄λ€λ λ 립μ μΈ κ°μ²΄λ‘μ μ‘΄μ¬
- μμ±μ ν¨μλ ꡬ문μ μΌλ‘λ μΌλ° ν¨μμ λμΌ
-
λ€λ§ νΈμΆ ν λ
newν€μλλ₯Ό ν΅ν΄ ν¨μλ₯Ό νΈμΆνλ©΄ μλ‘μ΄κ°μ²΄λ₯Ό μμ±νκ³ μ΄κΈ°νν¨ -
newν€μλλ§ λΆμ΄λ©΄ μΌλ° ν¨μλ μμ±μ ν¨μμ²λΌ 무쑰건 νΈμΆν μ μλκ±°μ?κΈ°μ μ μΌλ‘λ μλ°μ€ν¬λ¦½νΈμμ λͺ¨λ ν¨μλ
newν€μλμ ν¨κ» νΈμΆν μ μμ΄ μμ±μμ²λΌ μ¬μ©ν μ μμ. νμ§λ§ μ΄κ² μ’κ±°λ μλλ건 μλκΈ° λλ¬Έμ ꡬλ³μ μν λͺκ°μ§ λ°©λ²λ€μ μ¬μ©ν¨- μμ±μ ν¨μ: νμ€μΉΌ μΌμ΄μ€(PascalCase)λ‘ μ²« κΈμλ₯Ό λλ¬Έμλ‘ μλλ€ (μ:
Person,Product) - μΌλ° ν¨μ: μΉ΄λ© μΌμ΄μ€(camelCase)λ‘ μ²« κΈμλ₯Ό μλ¬Έμλ‘ μλλ€ (μ:
calculateTax,getUserData) - κ·μΉμ μν΄ νλ¨νλκ±°λΌ λΉμ°ν ν΄λ¨Όμλ¬λ νλ₯ λ§μ!
μμ±μ ν¨μλ μΌλ°μ μΌλ‘
thisν€μλλ₯Ό μ¬μ©νμ¬ μλ‘ μμ±λ κ°μ²΄μ μμ±μ μ΄κΈ°ννλλ‘ μ€κ³λμ΄ μμ΅λλ€:// μμ±μ ν¨μ - thisλ₯Ό μ¬μ©νμ¬ κ°μ²΄ μμ± μ€μ function Car(make, model) { this.make = make; this.model = model; this.isRunning = false; } // μΌλ° ν¨μ - κ°μ²΄λ₯Ό λ°ννκ±°λ λ€λ₯Έ μμ μν function createCar(make, model) { return { make: make, model: model, isRunning: false }; }
μμ±μ ν¨μλ λ³΄ν΅ μ무κ²λ λͺ μμ μΌλ‘ λ°ννμ§ μμ΅λλ€. λμ
thisκ° μ묡μ μΌλ‘ λ°νλ©λλ€. μΌλ° ν¨μλ λ³΄ν΅ κ°μ κ³μ°νκ±°λ λͺ μμ μΌλ‘ κ°μ²΄λ₯Ό λ°νν©λλ€.μμ±μ ν¨μμ μΌλ° ν¨μλ λ°ν κ° μ²λ¦¬μμλ μ°¨μ΄κ° μμ΅λλ€:
// μμ±μ ν¨μ - **κ°μ²΄λ₯Ό λ°ννλ©΄ this λμ κ·Έ κ°μ²΄κ° λ°νλ¨** function StrangeCtor() { this.prop = 1; return { differentProp: 2 }; // μ΄ κ°μ²΄κ° λ°νλ¨ } // μμ±μ ν¨μ - **μμκ°μ λ°ννλ©΄ 무μλκ³ thisκ° λ°νλ¨** function NormalCtor() { this.prop = 1; return 42; // 무μλ¨, thisκ° λ°νλ¨ } const strange = new StrangeCtor(); console.log(strange.prop); // undefined console.log(strange.differentProp); // 2 const normal = new NormalCtor(); console.log(normal.prop); // 1
μμ±μ ν¨μμμ κ°μ²΄λ₯Ό λͺ μμ μΌλ‘ λ°ννλ©΄
thisλμ κ·Έ κ°μ²΄κ° λ°νλκ³ , μμκ°μ λ°ννλ©΄ 무μλκ³thisκ° λ°νλ©λλ€.μΌλ° ν¨μλ₯Ό
newμ ν¨κ» νΈμΆνλ©΄ μμμΉ λͺ»ν λμμ΄ λ°μν μ μμ΅λλ€:function add(a, b) { return a + b; } const result = new add(3, 5); console.log(result); // add {} console.log(result instanceof add); // true console.log(result.constructor === add); // true
μ μμ μμ
new add(3, 5)λ λΉ κ°μ²΄λ₯Ό μμ±νκ³addν¨μμprototypeκ³Ό μ°κ²°ν©λλ€. νμ§λ§addν¨μλthisλ₯Ό μ¬μ©νμ¬ μμ±μ μΆκ°νμ§ μμΌλ©°, ν¨μκ° λ°ννλ κ°μ μ«μ(μμκ°)μ΄λ―λ‘ λ¬΄μλ©λλ€. κ²°κ³Όμ μΌλ‘ λΉ κ°μ²΄κ° λ°νλ©λλ€.μμ±μ ν¨μλ₯Ό
newμμ΄ νΈμΆνλ©΄ λ μ¬κ°ν λ¬Έμ κ° λ°μν μ μμ΅λλ€:function Person(name) { this.name = name; } // new μμ΄ νΈμΆ const person = Person('νκΈΈλ'); console.log(person); // undefined (ν¨μκ° λͺ μμ μΌλ‘ λ°ννλ κ°μ΄ μμ) console.log(name); // 'νκΈΈλ' (μ μ κ°μ²΄μ name μμ±μ΄ μΆκ°λ¨)
newμμ΄ νΈμΆλλ©΄thisλ μ μ κ°μ²΄(λΈλΌμ°μ μμλwindow, Node.jsμμλglobal)λ₯Ό κ°λ¦¬ν΅λλ€. λ°λΌμPerson('νκΈΈλ')μ μ μ κ°μ²΄μnameμμ±μ μΆκ°νλ κ²°κ³Όλ₯Ό κ°μ Έμ΅λλ€. μ΄λ μλνμ§ μμ μ μ λ³μ μ€μΌμ μΌμΌν¬ μ μμ΅λλ€.μ΄λ¬ν λ¬Έμ λ₯Ό λ°©μ§νκΈ° μν΄ μμ±μ ν¨μλ λ€μκ³Ό κ°μ΄ ꡬνν μ μμ΅λλ€:
// Scope-safe Constructor ν¨ν΄ // ES6 μ΄μ μ λ§μ΄ μ¬μ©λλ function SafePerson(name) { // new μμ΄ νΈμΆλ κ²½μ° newμ ν¨κ» λ€μ νΈμΆ **if (!(this instanceof SafePerson)) { return new SafePerson(name); }** this.name = name; } // new μμ΄ νΈμΆν΄λ μμ ν¨ const person1 = SafePerson('νκΈΈλ'); console.log(person1.name); // 'νκΈΈλ' // μΌλ°μ μΈ new νΈμΆλ μ μ μλ const person2 = new SafePerson('κΉμ² μ'); console.log(person2.name); // 'κΉμ² μ'
νΉμ
new.targetμ ν΅ν΄μλ κ°λ₯νλ€function SafePerson(name) { // new.targetμ΄ undefinedμ΄λ©΄ new μμ΄ νΈμΆλ κ² if (!new.target) { return new SafePerson(name); } this.name = name; } // new μμ΄ νΈμΆν΄λ μμ ν¨ const person1 = SafePerson('νκΈΈλ'); console.log(person1.name); // 'νκΈΈλ' // μΌλ°μ μΈ new νΈμΆλ μ μ μλ const person2 = new SafePerson('κΉμ² μ'); console.log(person2.name); // 'κΉμ² μ'
new.targetμ ES6μμ λμ λ λ©ν νλ‘νΌν°λ‘, ν¨μκ°newμ°μ°μμ ν¨κ» νΈμΆλμλμ§λ₯Ό νμΈνλ λ νλμ μΈ λ°©λ²μ λλ€.new.targetμ μ₯μ μ λ€μκ³Ό κ°μ΅λλ€:- λ λͺ
νν μλ νν:
new.targetμ λͺ μμ μΌλ‘ ν¨μκ° μμ±μλ‘ νΈμΆλμλμ§ νμΈνκΈ° μν λͺ©μ μΌλ‘ μ€κ³λμμ΅λλ€. - μμ κ΄κ³μμ λ μ νν λμ: μμ κ΄κ³μμ
this instanceof Constructor체ν¬λ λλ‘ μμμΉ λͺ»ν κ²°κ³Όλ₯Ό λΌ μ μμ§λ§,new.targetμ νμ νμ¬ νΈμΆλ μμ±μλ₯Ό μ νν κ°λ¦¬ν΅λλ€. - ν΄λμ€ λ΄λΆμμλ μ¬μ© κ°λ₯:
new.targetμ ES6 ν΄λμ€μ μμ±μ λ΄λΆμμλ μ¬μ©ν μ μμ΅λλ€.
ES6μμ λμ λ ν΄λμ€λ μ΄λ¬ν νΌλμ μ€μ΄κΈ° μν λ°©λ² μ€ νλμ λλ€:
class Person { constructor(name) { this.name = name; } } // ν΄λμ€λ λ°λμ newμ ν¨κ» νΈμΆν΄μΌ ν¨ // const person = Person('νκΈΈλ'); // TypeError: Class constructor Person cannot be invoked without 'new' const person = new Person('νκΈΈλ'); // μ μ μλ
ν΄λμ€ μμ±μλ
newμμ΄ νΈμΆν μ μμΌλ―λ‘, μ΄ λ¬Έμ λ₯Ό μμ²μ μΌλ‘ λ°©μ§ν©λλ€. - μμ±μ ν¨μ: νμ€μΉΌ μΌμ΄μ€(PascalCase)λ‘ μ²« κΈμλ₯Ό λλ¬Έμλ‘ μλλ€ (μ:
-
// μμ±μ ν¨μ μ μ
function Person(name, age) {
this.name = name;
this.age = age;
this.greet = function() {
return `μλ
νμΈμ, ${this.name}μ
λλ€!`;
};
}
// μμ±μ ν¨μλ₯Ό μ¬μ©ν κ°μ²΄ μμ±
const person1 = new Person('νκΈΈλ', 30);
const person2 = new Person('κΉμ² μ', 25);
console.log(person1.name); // 'νκΈΈλ'
console.log(person2.greet()); // 'μλ
νμΈμ, κΉμ² μμ
λλ€!'μμ±μ ν¨μκ° new ν€μλμ ν¨κ» νΈμΆλ λ λ΄λΆμ μΌλ‘ μΌμ΄λλ μΌμ λ€μκ³Ό κ°μ΅λλ€.
- μλ‘μ΄ λΉ κ°μ²΄κ° μμ±λ©λλ€.
- μ΄ κ°μ²΄μ
[[Prototype]](λλ__proto__)μ΄ μμ±μ ν¨μμprototypeμμ±κ³Ό μ°κ²°λ©λλ€. - ν¨μ λ΄λΆμ
thisκ° μλ‘ μμ±λ κ°μ²΄λ₯Ό κ°λ¦¬ν€λλ‘ μ€μ λ©λλ€. - ν¨μ λ³Έλ¬Έμ μ½λκ° μ€νλμ΄
thisλ₯Ό ν΅ν΄ κ°μ²΄μ μμ±κ³Ό λ©μλλ₯Ό μΆκ°ν©λλ€. - ν¨μκ° λͺ
μμ μΌλ‘ λ€λ₯Έ κ°μ²΄λ₯Ό λ°ννμ§ μλ ν,
thisμ λ°μΈλ©λ μ κ°μ²΄κ° λ°νλ©λλ€.- μ΄ λ λͺ μμ μΌλ‘ μμκ°μ λ°ννλ κ²½μ°μλ 무μλκ³ thisκ° λ°νλ¨
function new(Constructor, ...args) {
// 1. μλ‘μ΄ λΉ κ°μ²΄ μμ±
const obj = {};
// 2. κ°μ²΄μ νλ‘ν νμ
μ€μ
Object.setPrototypeOf(obj, Constructor.prototype);
// 3 & 4. μμ±μ ν¨μ μ€ν, thisλ₯Ό μ κ°μ²΄μ λ°μΈλ©
const result = Constructor.apply(obj, args);
// 5. μμ±μμ λ°νκ°μ΄ κ°μ²΄λ©΄ κ·Έ κ°μ²΄λ₯Ό, μλλ©΄ μ κ°μ²΄ λ°ν
return (typeof result === 'object' && result !== null) ? result : obj;
}μμ±μ ν¨μλ μΌλ° ν¨μμ ꡬλΆνκΈ° μν΄ μ²« κΈμλ₯Ό λλ¬Έμλ‘ μμ±νλ νμ€μΉΌ μΌμ΄μ€(PascalCase) λ€μ΄λ° 컨벀μ μ λ°λ¦
// μΌλ° ν¨μ - μΉ΄λ© μΌμ΄μ€
function calculateArea(radius) {
return Math.PI * radius * radius;
}
// μμ±μ ν¨μ - νμ€μΉΌ μΌμ΄μ€
function Circle(radius) {
this.radius = radius;
this.getArea = function() {
return Math.PI * this.radius * this.radius;
};
}μμ±μ ν¨μλ‘ κ°μ²΄λ₯Ό μμ±ν λ μ£Όμν μ μ λͺ¨λ μΈμ€ν΄μ€λ§λ€ λ©μλκ° μ€λ³΅ μμ±λλ€λ κ²μ λλ€. μ΄λ λ©λͺ¨λ¦¬ ν¨μ¨μ±μ μ νμν¬ μ μμ΅λλ€:
function Person(name) {
this.name = name;
// κ° μΈμ€ν΄μ€λ§λ€ λμΌν ν¨μκ° λ©λͺ¨λ¦¬μ μ€λ³΅ μμ±λ¨
this.greet = function() {
return `μλ
νμΈμ, ${this.name}μ
λλ€!`;
};
}
const p1 = new Person('νκΈΈλ');
const p2 = new Person('κΉμ² μ');
console.log(p1.greet === p2.greet); // false (λ€λ₯Έ ν¨μ κ°μ²΄)μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ νλ‘ν νμ μ νμ©ν©λλ€. νλ‘ν νμ μ λ©μλλ₯Ό μ μνλ©΄ λͺ¨λ μΈμ€ν΄μ€κ° μ΄λ₯Ό 곡μ νλ―λ‘ λ©λͺ¨λ¦¬ ν¨μ¨μ±μ΄ ν₯μλ©λλ€
function Person(name) {
this.name = name;
// μΈμ€ν΄μ€ μμ±λ§ μ¬κΈ°μ μ μ
}
// νλ‘ν νμ
μ λ©μλ μ μ (λͺ¨λ μΈμ€ν΄μ€κ° 곡μ )
Person.prototype.greet = function() {
return `μλ
νμΈμ, ${this.name}μ
λλ€!`;
};
const p1 = new Person('νκΈΈλ');
const p2 = new Person('κΉμ² μ');
console.log(p1.greet === p2.greet); // true (κ°μ ν¨μ κ°μ²΄ μ°Έμ‘°)νλ‘ν νμ μ λ€μ μ±ν°μμ λ μμΈν μ€λͺ
μ₯μ :
- λμΌν ꡬ쑰μ κ°μ²΄λ₯Ό μ¬λ¬ κ° μμ±ν λ μ½λ μ€λ³΅μ μ€μΌ μ μμ΅λλ€.
- νλ‘ν νμ μ ν΅ν΄ λ©μλλ₯Ό 곡μ νμ¬ λ©λͺ¨λ¦¬ ν¨μ¨μ±μ λμΌ μ μμ΅λλ€.
- κ°μ²΄κ° μ΄λ€ μμ±μλ‘λΆν° λ§λ€μ΄μ‘λμ§ μ½κ² νμΈν μ μμ΅λλ€(
instanceof). - ES6 μ΄μ μ μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ κΈ°λ³Έ ν¨ν΄μ΄μμ΅λλ€.
λ¨μ :
- νλ‘ν νμ μμ ꡬνμ΄ μ§κ΄μ μ΄μ§ μμ μ μμ΅λλ€.
newν€μλλ₯Ό μμ΄λ²λ¦¬λ©΄ μμμΉ λͺ»ν λ²κ·Έκ° λ°μν μ μμ΅λλ€.- ES6 ν΄λμ€μ λΉν΄ λ¬Έλ²μ΄ λ λͺ νν μ μμ΅λλ€.
- νλΌμ΄λΉ μμ±(private properties)μ κΈ°λ³Έμ μΌλ‘ μ§μνμ§ μμ΅λλ€.
μμ±μ ν¨μλ ES6 ν΄λμ€κ° λμ λκΈ° μ μ μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ꡬννλ μ£Όμ λ°©λ²μ΄μμ΅λλ€. μ€λλ μλ λ§μ λ κ±°μ μ½λμμ μ΄ ν¨ν΄μ λ³Ό μ μμΌλ©°, μλ°μ€ν¬λ¦½νΈμ νλ‘ν νμ κΈ°λ° μμμ μ΄ν΄νλ λ° μ€μν κ°λ μ λλ€. ES6 ν΄λμ€κ° λ³΄λ€ νλμ μΈ λ¬Έλ²μ μ 곡νμ§λ§, λ΄λΆμ μΌλ‘λ μ¬μ ν νλ‘ν νμ κΈ°λ°μ μμ±μ ν¨μ λ©μ»€λμ¦μ μ¬μ©ν©λλ€.
- ν¨μλ κ°μ²΄μ΄μ§λ§ μΌλ° κ°μ²΄μ λ€λ₯΄λ€.
- μΌλ° κ°μ²΄λ νΈμΆν μ μμ§λ§(call) ν¨μλ νΈμΆν μ μλ€.
- κ·Έλμ ν¨μλ μΌλ° κ°μ²΄μ λ¬λ¦¬ νΈμΆμ μν μΆκ°μ μΈ λ΄λΆμ¬λ¦μ κ°μ§κ³ μλ€.
| λ΄λΆ μ¬λ‘― | μ€λͺ | μν |
|---|---|---|
[[Call]] |
ν¨μ νΈμΆ μ μ€νλλ λ΄λΆ λ©μλ | ν¨μκ° μΌλ° ν¨μλ‘μ νΈμΆλ λ (func() νν) μ€νλλ μκ³ λ¦¬μ¦μ μ μ |
[[Construct]] |
μμ±μ νΈμΆ μ μ€νλλ λ΄λΆ λ©μλ | ν¨μκ° μμ±μ ν¨μλ‘μ νΈμΆλ λ (new func() νν) μ€νλλ μκ³ λ¦¬μ¦μ μ μ |
[[Environment]] |
ν¨μμ λ μ컬 νκ²½μ μ°Έμ‘° | ν¨μκ° μ μλ νκ²½(μ€μ½ν)μ κΈ°μ΅νμ¬ ν΄λ‘μ λ₯Ό ꡬν |
[[FormalParameters]] |
ν¨μμ λ§€κ°λ³μ λͺ©λ‘ μ μ₯ | ν¨μ νΈμΆ μ μΈμμ λ§€κ°λ³μλ₯Ό λ§€ννλ λ° μ¬μ© |
[[ECMAScriptCode]] |
ν¨μμ μ€ν μ½λ μ μ₯ | ν¨μ νΈμΆ μ μ€νλ μ½λλ₯Ό λ³΄κ΄ |
[[ScriptOrModule]] |
ν¨μκ° μ μλ μ€ν¬λ¦½νΈλ λͺ¨λ μ°Έμ‘° | ν¨μμ μΆμ²μ λͺ¨λ κ΄λ ¨ μ 보λ₯Ό κ΄λ¦¬ |
[[Realm]] |
ν¨μκ° μν μ€ν νκ²½ μ 보 | μ μ κ°μ²΄ λ± ν¨μ μ€νμ νμν νκ²½ μ 보 κ΄λ¦¬ |
[[HomeObject]] |
λ©μλκ° μ μλ κ°μ²΄ μ°Έμ‘° (ES6+) | super ν€μλ λμμ νμν μ 보 μ 곡 |
[[IsClassConstructor]] |
ν΄λμ€ μμ±μ μ¬λΆ (ES6+) | ν΄λμ€ μμ±μμ new μλ νΈμΆ λ°©μ§ |
[[InitialName]] |
ν¨μμ μλ μ΄λ¦ (λλ²κΉ μ©) | κ°λ° λꡬμμ ν¨μ μλ³μ λμ |
| λ΄λΆ μ¬λ‘― | μ€λͺ |
|---|---|
[[Prototype]] |
νλ‘ν νμ κ°μ²΄μ λν μ°Έμ‘° (μμ) |
[[Extensible]] |
κ°μ²΄μ νμ₯ κ°λ₯ μ¬λΆ |
[[OwnPropertyKeys]] |
κ°μ²΄ μμ μ λͺ¨λ νλ‘νΌν° ν€ λͺ©λ‘ |
| νλ‘νΌν° | μ€λͺ | μμ |
|---|---|---|
name |
ν¨μμ μ΄λ¦ | function foo() {}; console.log(foo.name); // "foo" |
length |
ν¨μ λ§€κ°λ³μμ μ | function(a, b, c) {}; // lengthλ 3 |
prototype |
μμ±μ ν¨μκ° μμ±νλ κ°μ²΄μ νλ‘ν νμ | MyConstructor.prototype.method = function() {}; |
arguments |
ν¨μ λ΄λΆμμ μ¬μ© κ°λ₯ν μ λ¬λ μΈμλ€ | function f() { console.log(arguments); } |
caller |
ν¨μλ₯Ό νΈμΆν ν¨μ (λΉνμ€) | function inner() { console.log(inner.caller); } |
- μ΄λ ν¨μκ° μΌλ° νΈμΆλ λλ
[[Call]]μμ±μ ν¨μλ‘ νΈμΆλ λλ[[Constructor]]κ° μ€νλλ€.
function foo() {}
// [[Call]μ΄ νΈμΆ
foo();
// [[Constructor]]
new foo();- μ΄ λ λ΄λΆ λ©μλ
[[Call]]μ κ°μ§λ ν¨μκ°μ²΄λ₯Ό callable μ΄λΌκ³ νλ€. - λ΄λΆ λ©μλ
[[Constructor]]μ κ°λ ν¨μ κ°μ²΄λ₯Ό constructor λΌκ³ λΆλ₯Έλ€. - λ΄λΆ λ©μλ
[[Constructor]]μ κ°μ§μλ ν¨μ κ°μ²΄λ₯Ό non-constructor λΌκ³ λΆλ₯Έλ€.
κ·Όλ° μ΄κ±° λ§λ κ·Έλ¦Όμ΄ μλκ±° κ°μλ° κ°μ²΄κ° κ°μ§κ³ μλ λ΄λΆλ©μλλ‘ κ·Έλ¦°κ±΄κ°?
βββββββββββββββββββββββββββββββ
β ν¨μ κ°μ²΄ (λͺ¨λ Callable) β
β β
β βββββββββββββββββ β
β β Constructor β β
β β ν¨μ β β
β βββββββββββββββββ β
β β
β βββββββββ Non-ββββββββββββ β
β Constructor ν¨μ β
βββββββββββββββββββββββββββββββ
- νΈμΆν μ μλ κ°μ²΄λ ν¨μ κ°μ²΄κ° μλλ―λ‘ λͺ¨λ ν¨μλ λ°λμ callable μ΄μ΄μΌνλ€.
- λ°λΌμ λͺ¨λ ν¨μ κ°μ²΄λ λ΄λΆ λ©μλ
[[Call]]μ κ°μ§κ³ μκ³ νΈμΆν μ μλ€. (μλμλ λ³κ°λ‘)
- λ°λΌμ λͺ¨λ ν¨μ κ°μ²΄λ λ΄λΆ λ©μλ
- κ·Έλ¬λ λͺ¨λ ν¨μ κ°μ²΄κ°
[[Constructor]]μ κ°μ§λ건 μλλ€.- λ°λΌμ ν¨μ κ°μ²΄λ constructor μΌ μλ μκ³ non-constructor μΌ μ μλ€.
- κ²°λ‘ μ μΌλ‘ λͺ¨λ ν¨μ κ°μ²΄λ callable μ΄λ©΄μ constructor μ΄κ±°λ callable μ΄λ©΄μ non-constructorλ€.
Constructor(μμ±μ) ν¨μμ Non-constructor(λΉμμ±μ) ν¨μ λΉκ΅
| κ΅¬λΆ | Constructor(μμ±μ) | Non-constructor(λΉμμ±μ) |
|---|---|---|
| μ μ | new μ°μ°μμ ν¨κ» νΈμΆνμ¬ κ°μ²΄λ₯Ό μμ±ν μ μλ ν¨μ |
new μ°μ°μμ ν¨κ» νΈμΆν μ μλ ν¨μ |
| λ΄λΆ μ¬λ‘― | [[Construct]] λ΄λΆ μ¬λ‘― 보μ |
[[Construct]] λ΄λΆ μ¬λ‘― 미보μ |
| νΈμΆ λ°©μ | μΌλ° ν¨μλ‘λ νΈμΆ κ°λ₯, μμ±μ ν¨μλ‘λ νΈμΆ κ°λ₯ | μ€μ§ μΌλ° ν¨μλ‘λ§ νΈμΆ κ°λ₯ |
μλ°μ€ν¬λ¦½νΈμμ ν¨μλ constructor(μμ±μ)μ non-constructor(λΉμμ±μ)λ‘ κ΅¬λΆν μ μμ΅λλ€. μ΄ κ΅¬λΆμ ν¨μκ° new μ°μ°μμ ν¨κ» μμ±μλ‘μ νΈμΆλ μ μλμ§ μ¬λΆμ κ΄ν κ²μ
λλ€.
| ν¨μ μ ν | μ€λͺ | μμ |
|---|---|---|
| ν¨μ μ μΈλ¬Έ | function ν€μλλ‘ μ μΈλ μΌλ° ν¨μ |
function Foo() {} |
| ν¨μ ννμ | λ³μμ ν λΉλ μ΅λͺ ν¨μ | const Foo = function() {}; |
| μμ±μ ν¨μ | λͺ μμ μΌλ‘ κ°μ²΄ μμ±μ μν΄ μ€κ³λ ν¨μ | function Person(name) { this.name = name; } |
| ν΄λμ€ μ μΈλ¬Έ | ES6μμ λμ λ ν΄λμ€ λ¬Έλ²μΌλ‘ μ μΈλ ν¨μ | class Person {} |
| ν΄λμ€ ννμ | λ³μμ ν λΉλ ν΄λμ€ | const Person = class {}; |
| Function μμ±μ | new Function()μΌλ‘ μμ±λ ν¨μ |
const add = new Function('a', 'b', 'return a + b'); |
| ν¨μ μ ν | μ€λͺ | μμ |
|---|---|---|
| νμ΄ν ν¨μ | ES6μμ λμ
λ => λ¬Έλ²μ ν¨μ |
const add = (a, b) => a + b; |
| λ©μλ μΆμ½ νν | ES6μμ λμ λ κ°μ²΄ 리ν°λ΄ λ΄ λ©μλ μΆμ½ν | const obj = { method() { } }; |
| ν΄λμ€ λ΄λΆ λ©μλ | ν΄λμ€ λ΄λΆμ μ μλ λ©μλ | class Person { speak() { } } |
| μ λλ μ΄ν° ν¨μ | function* λ¬Έλ²μΌλ‘ μ μλ ν¨μ |
function* gen() { yield 1; } |
Constructorμ Non-constructor μλ³ λ°©λ²
function isConstructor(fn) {
try {
new fn();
return true;
} catch (error) {
return false;
}
}
// ν
μ€νΈ μμ
function regularFunction() {}
const arrowFunction = () => {};
const methodObj = { method() {} };
console.log(isConstructor(regularFunction)); // true
console.log(isConstructor(arrowFunction)); // false
console.log(isConstructor(methodObj.method)); // false- λΉ κ°μ²΄ μμ± λ° this λ°μΈλ©
- κ°μ²΄μ νλ‘ν νμ μ€μ
- thisλ₯Ό ν΅ν νλ‘νΌν° μΆκ°
- μμ±λ κ°μ²΄ λ°ν
- TypeError: [ν¨μλͺ ] is not a constructor μλ¬ λ°μ
- μμμ 보μλ― λ©μλμ κ²½μ°μλ non-constructorλ€
- κ·Έλ¬λ λ©μλλ‘ μΈμ λλ건 λ©μλ μΆμ½ ννλ§ λ©μλλ‘ μΈμ λλ€.
// μΌλ° ν¨μ μ μ : ν¨μ μ μΈλ¬Έ, ν¨μ ννμ
function foo() {}
const bar = function() {};
// νλ‘νΌν° xμ κ°μΌλ‘ ν λΉλ κ²μ μΌλ° ν¨μλ‘ μ μλ ν¨μμ΄λ€.
// μ΄λ λ©μλλ‘ μΈμ νμ§ μλλ€.
const baz = {
x: function () {}
}
// μΌλ° ν¨μλ‘ μ μλ ν¨μλ§μ΄ constructorλ€.
new foo(); // -> foo {}
new bar(); // -> bar {}
**new baz.x(); // -> x {}**
// νμ΄ν ν¨μλ μΆμ½ ννλ λ©μλλ non-constructor λ€.
const arrow = () => {};
new arrow(); // TypeError: arrow is not a constructor
// λ©μλ μ μ: ES6μ λ©μλ μΆμ½ ννλ§ λ©μλλ‘ μΈμ νλ€.
const obj = {
x() {}
y: function () {}
};
new obj.x(); // TypeError: obj.x is not a constructor
new baz.y(); // -> y {}-
κ·ΈλΌ λ©μλλ λμ§?
μ’μ μ§λ¬Έμ λλ€! μλ°μ€ν¬λ¦½νΈμμ λ©μλμ μ μκ° μ΄λ»κ² λ³νν΄μλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
μλ°μ€ν¬λ¦½νΈμμ "λ©μλ"λΌλ μ©μ΄λ μκ°μ΄ μ§λ¨μ λ°λΌ μλ―Έκ° μ‘°κΈμ© λ³ννμ΅λλ€.
μ ν΅μ μΌλ‘ λ©μλλ λ¨μν "κ°μ²΄μ νλ‘νΌν°λ‘ ν λΉλ ν¨μ"λ₯Ό μλ―Ένμ΅λλ€. μ¦, κ°μ²΄μ νλ‘νΌν° κ°μΌλ‘ ν¨μκ° ν λΉλμ΄ μλ€λ©΄ κ·Έκ²μ λ©μλλΌκ³ λΆλ μ΅λλ€.
const obj = { x: function() {}, // μ ν΅μ μλ―Έμ λ©μλ y: function() {} // μ ν΅μ μλ―Έμ λ©μλ }; function Foo() {} obj.z = Foo; // μ΄κ²λ μ ν΅μ μλ―Έμμλ λ©μλ
μ΄ κ΄μ μμλ λ©μλκ° μ΄λ»κ² μ μλμλμ§λ³΄λ€ "κ°μ²΄μ μν ν¨μ"λΌλ κ΄κ³μ μ΄μ μ λ§μ·μ΅λλ€.
ES6λΆν°λ λ©μλμ μ μκ° λ λͺ νν΄μ‘μ΅λλ€. ECMAScript λͺ μΈμμλ λ©μλλ₯Ό "ES6μ λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μ"λ‘ λ ꡬ체μ μΌλ‘ μ μν©λλ€. μ΄λ¬ν ν¨μλ€μ
[[HomeObject]]λ΄λΆ μ¬λ‘―μ κ°λ νΉλ³ν ν¨μμ λλ€.const obj = { x() {}, // ES6 λ©μλ (μ§μ§ λ©μλ) y: function() {} // ν¨μ νλ‘νΌν° (μ ν΅μ μλ―Έμ λ©μλμ§λ§, μ§μ§ λ©μλλ μλ) };
μ¬κΈ°μ
xλ ES6 λͺ μΈμμ λ§νλ μ§μ§ "λ©μλ"μ λλ€. μ΄κ²μ non-constructorμ΄λ©°,[[HomeObject]]λ΄λΆ μ¬λ‘―μ κ°μ§κ³ μμ΄superν€μλλ₯Ό μ¬μ©ν μ μμ΅λλ€. λ°λ©΄yλ ν¨μ ννμμ΄ κ°μ²΄μ νλ‘νΌν°μ ν λΉλ κ²μΌλ‘, constructorμ λλ€.κ·νμ μμ λ₯Ό λΆμν΄λ³΄κ² μ΅λλ€:
const obj = { x() {}, // λ©μλ μΆμ½ νν (ES6 λ©μλ) y: function() {} // ν¨μ ννμμ νλ‘νΌν° κ°μΌλ‘ ν λΉ }; new obj.x(); // TypeError: obj.x is not a constructor new obj.y(); // -> y {}
obj.xλ λ©μλ μΆμ½ ννμΌλ‘ μ μλμμΌλ―λ‘ ES6 λͺ μΈμμ λ§νλ μ§μ§ "λ©μλ"μ λλ€. μ΄κ²μ non-constructorμ΄λ―λ‘newμ ν¨κ» νΈμΆν μ μμ΅λλ€.obj.yλ ν¨μ ννμμ΄ νλ‘νΌν°μ ν λΉλ κ²μ λλ€. μ΄κ²μ constructorμ΄λ―λ‘newμ ν¨κ» νΈμΆν μ μμ΅λλ€. ES6 λͺ μΈ κ΄μ μμλ μ΄κ²μ "λ©μλ"κ° μλλΌ "ν¨μ νλ‘νΌν°"λΌκ³ ν μ μμ΅λλ€.
μλ°μ€ν¬λ¦½νΈμμ "λ©μλ"λΌλ μ©μ΄λ λ κ°μ§ κ΄μ μμ λ³Ό μ μμ΅λλ€:
- κ΄μμ λ©μλ (μΌλ°μ μΈ νλ‘κ·Έλλ° κ΄μ ): κ°μ²΄μ μν λͺ¨λ ν¨μ. μ΄ κ΄μ μμλ
obj.xμobj.yλͺ¨λ λ©μλμ λλ€. - νμμ λ©μλ (ES6 λͺ
μΈ κ΄μ ): λ©μλ μΆμ½ ννμΌλ‘ μ μλ,
[[HomeObject]]λ΄λΆ μ¬λ‘―μ κ°μ§ non-constructor ν¨μ. μ΄ κ΄μ μμλobj.xλ§ λ©μλμ΄κ³obj.yλ λ©μλκ° μλλλ€.
νλ μλ°μ€ν¬λ¦½νΈμμλ λ©μλλΌλ μ©μ΄λ₯Ό μ΄μΌκΈ°ν λ λ³΄ν΅ λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μ(ES6 λ©μλ)λ₯Ό μλ―Ένλ κ²½μ°κ° λ§μ΅λλ€. μ΄κ²μ΄ ES6 λͺ μΈμμ μ μνλ λ©μλμ 곡μμ μΈ μλ―Έμ λλ€.
λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μ(ES6 λ©μλ)λ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§λλ€:
- non-constructorμ λλ€. (newμ ν¨κ» νΈμΆν μ μμ)
[[HomeObject]]λ΄λΆ μ¬λ‘―μ κ°μ§λλ€. (super μ°Έμ‘° κ°λ₯)- νλ‘ν νμ νλ‘νΌν°κ° μμ΅λλ€.
μ΄λ° ꡬλΆμ μλ°μ€ν¬λ¦½νΈκ° κ°μ²΄ μ§ν₯ κΈ°λ₯μ κ°ννλ©΄μ μκΈ΄ κ²μΌλ‘, κ°μ²΄μ λ©μλκ° κ°μ§λ νΉλ³ν μλ―Έλ₯Ό λ°μν©λλ€. νΉν
superν€μλμ μ¬μ©κ³Ό κ΄λ ¨ν΄ λ©μλμ μΌλ° ν¨μ νλ‘νΌν°λ₯Ό ꡬλΆνλ κ²μ΄ μ€μν΄μ‘μ΅λλ€.λ°λΌμ κΈ°μ μ μΌλ‘ μ νν λ΅λ³μ "ES6 μ΄ν μλ°μ€ν¬λ¦½νΈμμ λ©μλλ λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μ"μ λλ€λ§, μ€λ¬΄μμλ μ¬μ ν κ°μ²΄μ νλ‘νΌν°μΈ ν¨μλ₯Ό μΌλ°μ μΌλ‘ λͺ¨λ λ©μλλΌκ³ λΆλ₯΄λ κ²½μ°λ λ§μ΅λλ€.
-
super ν€μλμ [[HomeObject]]μ κ΄κ³
superν€μλμ λ©μλ ꡬλΆμ λν΄ λ μμΈν μ€λͺ ν΄ λλ¦¬κ² μ΅λλ€. μ΄ μ£Όμ λ μλ°μ€ν¬λ¦½νΈμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° κΈ°λ₯κ³Ό κΉκ² μ°κ²°λμ΄ μμ΅λλ€superν€μλλ ES6μμ λμ λμμΌλ©°, μμ νλ‘ν νμ μ λ©μλλ μμ±μ μ κ·Όν μ μκ² ν΄μ€λλ€. μ΄ κΈ°λ₯μ΄ μ λλ‘ μλνλ €λ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ νμ¬ λ©μλκ° μ΄λ€ κ°μ²΄μ μν΄ μλμ§ μμμΌ ν©λλ€. μ΄λ₯Ό μν΄ ES6 λ©μλλ[[HomeObject]]λΌλ νΉλ³ν λ΄λΆ μ¬λ‘―μ κ°μ΅λλ€.[[HomeObject]]λ λ©μλκ° μν κ°μ²΄λ₯Ό μ°Έμ‘°νλ λ΄λΆ μ¬λ‘―μΌλ‘, μλ°μ€ν¬λ¦½νΈ μμ§μ΄superμ°Έμ‘°λ₯Ό ν΄κ²°ν λ μ¬μ©λ©λλ€. μ΄ μ¬λ‘―μ μ€μ§ λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μλ§ κ°μ§λ©°, μΌλ° ν¨μ νλ‘νΌν°λ κ°μ§μ§ μμ΅λλ€.const parent = { sayHello() { return "μλ νμΈμ!"; } }; const child = { __proto__: parent, // λ©μλ μΆμ½ νν - [[HomeObject]]λ₯Ό κ°μ§ sayHello() { return super.sayHello() + " λ°κ°μ΅λλ€!"; }, // μΌλ° ν¨μ νλ‘νΌν° - [[HomeObject]]κ° μμ greet: function() { // Error: superλ μ¬κΈ°μ μ¬μ©ν μ μμ return super.sayHello() + " λ°κ°μ΅λλ€!"; } }; console.log(child.sayHello()); // "μλ νμΈμ! λ°κ°μ΅λλ€!" console.log(child.greet()); // Error: 'super' keyword unexpected here
μ μμ μμ
sayHello()λ λ©μλ μΆμ½ ννμΌλ‘ μ μλμκΈ° λλ¬Έμ[[HomeObject]]μ¬λ‘―μ κ°μ§λ©°, μ΄λ₯Ό ν΅ν΄super.sayHello()κ° μ¬λ°λ₯΄κ² λΆλͺ¨ κ°μ²΄μsayHelloλ©μλλ₯Ό μ°Έμ‘°ν μ μμ΅λλ€.λ°λ©΄,
greetμ μΌλ° ν¨μ ννμμ΄ ν λΉλ κ²μ΄λ―λ‘[[HomeObject]]μ¬λ‘―μ΄ μκ³ , λ°λΌμ λ΄λΆμμsuperλ₯Ό μ¬μ©νλ €κ³ νλ©΄ μ€λ₯κ° λ°μν©λλ€.μ΄ κ΅¬λΆμ΄ μ€μν μ΄μ λ λ€μκ³Ό κ°μ΅λλ€:
- μμ λ©μ»€λμ¦μ λͺ
νν: ES6λ ν΄λμ€μ ν¨κ» λ λͺ
μμ μΈ μμ λͺ¨λΈμ λμ
νμ΅λλ€.
superν€μλλ μ΄ μμ λͺ¨λΈμ ν΅μ¬ λΆλΆμ΄λ©°, λ©μλμ μΌλ° ν¨μ νλ‘νΌν°λ₯Ό ꡬλΆν¨μΌλ‘μ¨ μμ κ΄κ³κ° λ λͺ νν΄μ§λλ€. - λ©μλ λ°μΈλ©μ κ°μν: λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μλ
thisλ°μΈλ©μ΄ λ³΄λ€ μ§κ΄μ μ λλ€. μΌλ° ν¨μμ λ¬λ¦¬, νμ΄ν ν¨μμ²λΌ λ³λμ λ°μΈλ© μμ μμ΄λ μμ 컨ν μ€νΈμthisλ₯Ό νμ©ν μ μμ΅λλ€. - μ΅μ ν κΈ°ν: μλ°μ€ν¬λ¦½νΈ μμ§μ μ΄λ¬ν ꡬλΆμ ν΅ν΄ λ©μλ νΈμΆκ³Ό κ΄λ ¨λ μ΅μ νλ₯Ό λ ν¨κ³Όμ μΌλ‘ μνν μ μμ΅λλ€.
λ€μ μμ λ₯Ό ν΅ν΄ λ ꡬ체μ μΌλ‘ μ΄ν΄λ³΄κ² μ΅λλ€:
// λΆλͺ¨ κ°μ²΄ const vehicle = { getSpeed() { return this.speed; }, accelerate(increment) { this.speed += increment; return this.speed; } }; // μμ κ°μ²΄ const car = { __proto__: vehicle, speed: 0, // ES6 λ©μλ - super μ¬μ© κ°λ₯ accelerate(increment) { // λΆλͺ¨μ accelerateλ₯Ό νΈμΆνλ©΄μ μ¦κ°λμ 2λ°°λ‘ return super.accelerate(increment * 2); }, // μΌλ° ν¨μ νλ‘νΌν° turboBoost: function(increment) { // λ€μ μ€μ μ€λ₯ λ°μ! - superλ₯Ό μ¬μ©ν μ μμ // return super.accelerate(increment * 3); // λμ λ€μκ³Ό κ°μ΄ ν΄μΌ ν¨ return vehicle.accelerate.call(this, increment * 3); } }; car.speed = 10; console.log(car.accelerate(5)); // 20 (10 + 5*2) // λ€μκ³Ό κ°μ΄ λ©μλλ₯Ό λ³λ λ³μμ ν λΉνλ©΄ μ΄λ»κ² λ κΉ? const carAccelerate = car.accelerate; // μ΄μ carAccelerateλ [[HomeObject]]λ₯Ό μμ§ μκ³ μ¬μ ν carλ₯Ό μ°Έμ‘° // νμ§λ§ thisλ undefinedλ‘ λ°λλ―λ‘ μ§μ νΈμΆνλ©΄ μ€λ₯ λ°μ // carAccelerate(5); // μ€λ₯: Cannot read property 'speed' of undefined
μ΄ μμ μμ
car.accelerateλ λ©μλ μΆμ½ ννμΌλ‘ μ μλμμΌλ―λ‘[[HomeObject]]μ¬λ‘―μ κ°μ§λ©°, μ΄ μ¬λ‘―μcarκ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€. λ°λΌμsuper.accelerate()λcarμ νλ‘ν νμ μΈvehicleμaccelerateλ©μλλ₯Ό μ°Ύμ νΈμΆν©λλ€.λ°λ©΄
car.turboBoostλ μΌλ° ν¨μ ννμμ΄ ν λΉλ κ²μ΄λ―λ‘[[HomeObject]]μ¬λ‘―μ΄ μκ³ ,superλ₯Ό μ¬μ©ν μ μμ΅λλ€. λμvehicle.accelerate.call(this, ...)μ κ°μ λ°©μμΌλ‘ λΆλͺ¨ λ©μλλ₯Ό νΈμΆν΄μΌ ν©λλ€.ν΄λμ€ λ΄μμ μ μλ λ©μλλ€λ λͺ¨λ λ©μλ μΆμ½ ννκ³Ό λμΌν νΉμ±μ κ°μ§λλ€:
class Animal { constructor(name) { this.name = name; } speak() { return `${this.name}μ΄(κ°) μ리λ₯Ό λ λλ€`; } } class Dog extends Animal { speak() { // super.speak()λ Animal.prototype.speak.call(this)μ κ°μ return `${super.speak()}, λ©λ©!`; } // μΌλ° ν¨μλ₯Ό ν΄λμ€ νλμ ν λΉ bark = function() { // λ€μ μ€μ μ€λ₯ λ°μ! // return `${super.speak()}, ν¬κ² μ§μ΅λλ€!`; return `${Animal.prototype.speak.call(this)}, ν¬κ² μ§μ΅λλ€!`; } } const dog = new Dog('λ½μ'); console.log(dog.speak()); // "λ½μμ΄(κ°) μ리λ₯Ό λ λλ€, λ©λ©!" console.log(dog.bark()); // "λ½μμ΄(κ°) μ리λ₯Ό λ λλ€, ν¬κ² μ§μ΅λλ€!"
ν΄λμ€μ
speakλ©μλλ λ©μλ μΆμ½ ννκ³Ό λμΌνκ² μ·¨κΈλμ΄[[HomeObject]]μ¬λ‘―μ κ°μ§λ©°, λ°λΌμsuperλ₯Ό μ¬μ©ν μ μμ΅λλ€. λ°λ©΄ ν΄λμ€ νλμ ν λΉλ μΌλ° ν¨μbarkλ[[HomeObject]]μ¬λ‘―μ΄ μμ΄superλ₯Ό μ¬μ©ν μ μμ΅λλ€.μ΄λ¬ν ꡬλΆμ μ€λ¬΄μ ν¨μλ λ€μκ³Ό κ°μ΅λλ€:
- λ©μλ μ μ μ μΌκ΄μ±: κ°μ²΄λ ν΄λμ€μμ λ©μλλ₯Ό μ μν λλ μΌκ΄λκ² λ©μλ μΆμ½ ννμ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. μ΄λ
superμ μ¬μ© κ°λ₯μ±μ 보μ₯νκ³ , μ½λμ μΌκ΄μ±μ μ μ§ν©λλ€. - μμ κ΄κ³μμμ λͺ
νμ±: μμ κ΄κ³μμ λΆλͺ¨ λ©μλλ₯Ό νΈμΆν΄μΌ ν λλ
superλ₯Ό μ¬μ©νλ κ²μ΄ λ λͺ ννκ³ κ°κ²°ν©λλ€. μ΄λ₯Ό μν΄μλ λ©μλ μΆμ½ ννμ μ¬μ©ν΄μΌ ν©λλ€. - μ½λ μ΅μ ν: μλ°μ€ν¬λ¦½νΈ μμ§μ λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μλ₯Ό μ΅μ νν μ μλ μ¬μ§κ° λ λ§μ΅λλ€. λ°λΌμ μ±λ₯ μΈ‘λ©΄μμλ λ©μλ μΆμ½ ννμ μ νΈνλ κ²μ΄ μ’μ΅λλ€.
ES6μμ λ©μλμ μΌλ° ν¨μ νλ‘νΌν°μ ꡬλΆμ λ¨μν λ¬Έλ²μ μ°¨μ΄λ₯Ό λμ΄,
superν€μλμ μ¬μ©κ³Ό κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ν΅μ¬ κ°λ μΈ μμμ λ ν¨κ³Όμ μΌλ‘ μ§μνκΈ° μν μ€μν λ³νμ λλ€. λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μλ[[HomeObject]]λ΄λΆ μ¬λ‘―μ ν΅ν΄ μμ μ΄ μν κ°μ²΄λ₯Ό μκ³ μμ΄,superμ°Έμ‘°λ₯Ό μ¬λ°λ₯΄κ² ν΄κ²°ν μ μμ΅λλ€. μ΄λ¬ν ꡬλΆμ μ΄ν΄νκ³ μ μ ν νμ©νλ©΄ λ λͺ ννκ³ ν¨μ¨μ μΈ κ°μ²΄ μ§ν₯ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μμ±ν μ μμ΅λλ€. - μμ λ©μ»€λμ¦μ λͺ
νν: ES6λ ν΄λμ€μ ν¨κ» λ λͺ
μμ μΈ μμ λͺ¨λΈμ λμ
νμ΅λλ€.
Quiz) μμ±μ ν¨μλ₯Ό μΌλ° ν¨μμ²λΌ νΈμΆνλ©΄ λ°μνλ μΌ, μ΄λ₯Ό λ§κΈ°μν λ°©λ² 2κ°μ§ μ λ