λͺ
λ Ήν
ν¨μν
νλ‘ν νμ
κΈ°λ° κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°
μ μ§μνλ λ©ν° ν¨λ¬λ€μ νλ‘κ·Έλλ° μΈμ΄λ€.
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
μ νλ‘κ·Έλ¨μ λͺ λ Ήμ΄ λλ ν¨μμ λͺ©λ‘μΌλ‘ 보λ μ ν΅μ μΈλͺ λ Ήν νλ‘κ·Έλλ°
μ μ μ°¨μ§ν₯μ κ΄μ μμ λ²μ΄λ μ¬λ¬κ°μ λ 립μ λ¨μ μ¦,κ°μ²΄
μ μ§ν©μΌλ‘ νλ‘κ·Έλ¨μ ννν λ €λ νλ‘κ·Έλλ° ν¨λ¬λ€μμ λ§νλ€.
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
μ μ€μΈκ³μ μ€μ²΄(μ¬λ¬Όμ΄λ κ°λ )λ₯Ό μΈμνλ μ² νμ μ¬κ³ λ₯Ό νλ‘κ·Έλλ°μ μ λͺ©νλ €λ μλμμ μμ
μ€μ²΄λ νΉμ±μ΄λ μ±μ§μ λνλ΄λμμ±
μ κ°μ§κ³ μκ³ , μ΄λ₯Ό ν΅ν΄ μ€μ²΄λ₯Ό μΈμνκ±°λ ꡬλ³. ex) μ¬λμ "μ΄λ¦", "μ£Όμ", "μ±λ³", "λμ΄", "μ μ₯", "체μ€", "νλ ₯" λ± λ€μνμμ±
μ κ°μ§κ³ μκ³ , μ΄λ μ΄λ¦μ΄ μ΄λ¬΄κ° μ±λ³ μ¬μ± λμ΄ 20μΈμΈ μ¬λκ³Ό κ°μ΄μμ±
μ ꡬ체μ μΌλ‘ νννλ©΄ νΉμ ν μ¬λμ λ€λ₯Έ μ¬λκ³Ό ꡬλ³νμ¬ μΈμν μ μλ€
μ¬λμκ²λ λ€μν μμ±μ΄ μμΌλ μ°λ¦¬κ° ꡬννλ €λ νλ‘κ·Έλ¨μμλ μ¬λμ "μ΄λ¦", "μ£Όμ"λΌλ μμ±μλ§ κ΄μ¬μλ€κ³ κ°μ μ΄μ²λΌ λ€μν μμ± μ€μ νλ‘κ·Έλ¨μ νμν μμ±λ§ κ°μ£Όλ € λ΄μ¬ νννλ €λ κ²μμΆμν
λΌ νλ€.
// μ΄λ¦κ³Ό μ£Όμ μμ±μ κ°λ κ°μ²΄
const person = {
name: "noh",
address: "Seoul"
};
console.log(person); // {name: "noh", address: "Seoul"}
μμ person κ°μ²΄λ₯Ό λ€λ₯Έ κ°μ²΄μ ꡬλ³νμ¬ μΈμν μ μλ€. μ΄μ²λΌ μμ±μ ν΅ν΄ μ¬λ¬ κ°μ κ°μ νλμ λ¨μλ‘ κ΅¬μ±ν 볡ν©μ μΈ μλ£κ΅¬μ‘°λ₯Ό κ°μ²΄λΌνλ©°,
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
μ λ 립μ μΈ κ°μ²΄μ μ§ν©μΌλ‘ νλ‘κ·Έλ¨μ νννλ €λ νλ‘κ·Έλλ° ν¨λ¬λ€μμ΄λ€.
μ΄λ²μλ μμ΄λΌλ κ°λ μ κ°μ²΄λ‘ λ§λ€μ΄λ³΄μ. μμλ λ°μ§λ¦μ΄λΌλ μμ±μ΄ μκ³ μ΄ λ°μ§λ¦μ κ°μ§κ³ μ§λ¦, λλ , λμ΄λ₯Ό ꡬν μ μλ€. μ΄λ λ°μ§λ¦μ μμ μνλ₯Ό λνλ΄λ λ°μ΄ν°μ΄λ©° μμ μ§λ¦, λλ , λμ΄λ₯Ό ꡬνλ κ²μ λμμ΄λ€.
const circle = {
// property
radius: 5, // λ°μ§λ¦
// method
// μμ μ§λ¦: 2r
getDiameter() {
return 2 * this.radius;
},
// method
// μμ λλ : 2Οr
getPerimeter() {
return 2 * Math.PI * this.radius;
},
// method
// μμ λμ΄: Οrr
getArea() {
return Math.PI * this.radius ** 2;
}
};
console.log(circle);
// {radius: 5, getDiameter: Ζ, getPerimeter: Ζ, getArea: Ζ}
console.log(circle.getDiameter()); // 10
console.log(circle.getPerimeter()); // 31.41592653589793
console.log(circle.getArea()); // 78.53981633974483
κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
μ κ°μ²΄μ μνλ₯Ό λνλ΄λ λ°μ΄ν°μ μν λ°μ΄ν°λ₯Ό μ‘°μν μ μλ λμμ νλμ λ Όλ¦¬μ μΈ λ¨μλ‘ λ¬Άμ΄ μκ°νλ€. λ°λΌμ κ°μ²΄λ μν λ°μ΄ν°μ λμμ νλμ λ Όλ¦¬μ μΈ λ¨μλ‘ λ¬Άμ 볡ν©μ μΈ μλ£κ΅¬μ‘°λΌκ³ ν μ μλ€. μ΄λ κ°μ²΄μ μν λ°μ΄ν°λ₯Όνλ‘νΌν°
λμμλ©μλ
λΌ λΆλ₯Έλ€
μμ
μ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ ν΅μ¬ κ°λ μΌλ‘, μ΄λ€ κ°μ²΄μ νλ‘νΌν° λλ λ©μλλ₯Ό λ€λ₯Έ κ°μ²΄κ° μμλ°μ κ·Έλλ‘ μ¬μ©ν μ μλ κ²μ λ§νλ€. μλ°μ€ν¬λ¦½νΈλνλ‘ν νμ
μ κΈ°λ°μΌλ‘μμ
μ ꡬννμ¬ λΆνμν μ€λ³΅μ μ κ±°νλ€.
π λ©μλλ₯Ό μ€λ³΅μΌλ‘ μμ± μμ νλ μμ
// μμ±μ ν¨μ
function Circle(radius) {
this.radius = radius;
this.getArea = function () {
// Math.PIλ μμ£Όμ¨μ λνλ΄λ μμλ€.
return Math.PI * this.radius ** 2;
};
}
// λ°μ§λ¦μ΄ 1μΈ μΈμ€ν΄μ€ μμ±
const circle1 = new Circle(1);
// λ°μ§λ¦μ΄ 2μΈ μΈμ€ν΄μ€ μμ±
const circle2 = new Circle(2);
// Circle μμ±μ ν¨μλ μΈμ€ν΄μ€λ₯Ό μμ±ν λλ§λ€ λμΌν λμμ νλ
// getArea λ©μλλ₯Ό μ€λ³΅ μμ±νκ³ λͺ¨λ μΈμ€ν΄μ€κ° μ€λ³΅ μμ νλ€.
// getArea λ©μλλ νλλ§ μμ±νμ¬ λͺ¨λ μΈμ€ν΄μ€κ° 곡μ ν΄μ μ¬μ©νλ κ²μ΄ λ°λμ§νλ€.
console.log(circle1.getArea === circle2.getArea); // false
console.log(circle1.getArea()); // 3.141592653589793
console.log(circle2.getArea()); // 12.566370614359172
Circle μμ±μ ν¨μκ° μμ±νλ λͺ¨λ κ°μ²΄(μΈμ€ν΄μ€κ°)λ radius νλ‘νΌν° getArea λ©μλλ₯Ό κ°λλ€.
radius νλ‘νΌν° κ°μ μΌλ°μ μΌλ‘ μΈμ€ν΄μ€ λ§λ€ λ€λ₯΄λ€μ§λ§ getArea λ©μλλ λͺ¨λ μΈμ€ν΄μ€κ° λμΌν λ΄μ©μ λ©μλλ₯Ό μ¬μ©νλ―λ‘ λ¨ νλλ§ μμ±νμ¬ λͺ¨λ μΈμ€ν΄μ€κ° 곡μ ν΄μ μ¬μ©νλ κ²μ΄ λ°λμ§νλ€.
π νλ‘ν νμ μ κΈ°λ°μΌλ‘ μμμ ꡬνν μμ
// μμ±μ ν¨μ
function Circle(radius) {
this.radius = radius;
}
// Circle μμ±μ ν¨μκ° μμ±ν λͺ¨λ μΈμ€ν΄μ€κ° getArea λ©μλλ₯Ό
// 곡μ ν΄μ μ¬μ©ν μ μλλ‘ νλ‘ν νμ
μ μΆκ°νλ€.
// νλ‘ν νμ
μ Circle μμ±μ ν¨μμ prototype νλ‘νΌν°μ λ°μΈλ©λμ΄ μλ€.
Circle.prototype.getArea = function () {
return Math.PI * this.radius ** 2;
};
// μΈμ€ν΄μ€ μμ±
const circle1 = new Circle(1);
const circle2 = new Circle(2);
// Circle μμ±μ ν¨μκ° μμ±ν λͺ¨λ μΈμ€ν΄μ€λ λΆλͺ¨ κ°μ²΄μ μν μ νλ
// νλ‘ν νμ
Circle.prototypeμΌλ‘λΆν° getArea λ©μλλ₯Ό μμλ°λλ€.
// μ¦, Circle μμ±μ ν¨μκ° μμ±νλ λͺ¨λ μΈμ€ν΄μ€λ νλμ getArea λ©μλλ₯Ό 곡μ νλ€.
console.log(circle1.getArea === circle2.getArea); // true
console.log(circle1.getArea()); // 3.141592653589793
console.log(circle2.getArea()); // 12.566370614359172
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ μ κΈ°λ°μΌλ‘ μμμ ꡬννλ€. Circle μμ±μ ν¨μκ° μμ±ν λͺ¨λ μΈμ€ν΄μ€ μμ μ νλ‘ν νμ , μ¦ μμ(λΆλͺ¨) κ°μ²΄ μν μ νλ Circle.prototypeμ λͺ¨λ νλ‘νΌν°μ λ©μλλ₯Ό μμλ°λλ€.
νλ‘ν νμ κ°μ²΄
λ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ κ·Όκ°μ μ΄λ£¨λ κ°μ²΄κ°μμ
μ ꡬννκΈ° μν΄ μ¬μ©.
νλ‘ν νμ
μ μ΄λ€ κ°μ²΄μ μμ(λΆλͺ¨) κ°μ²΄μ μν μ νλ κ°μ²΄λ‘μ λ€λ₯Έ κ°μ²΄μ 곡μ νλ‘νΌν°(λ©μλ ν¬ν¨)λ₯Ό μ 곡νλ€.νλ‘ν νμ
μ μμλ°μ νμ(μμ) κ°μ²΄λ μμ κ°μ²΄μ νλ‘νΌν°λ₯Ό μμ μ νλ‘νΌν°μ²λΌ μμ λ‘κ² μ¬μ©ν μ μλ€.
λͺ¨λ κ°μ²΄λ[[Prototype]]
μ΄λΌλ λ΄λΆ μ¬λ‘―μ κ°μ§λ©°, μ΄ λ΄λΆ μ¬λ‘―μ κ°μνλ‘ν νμ
μ μ°Έμ‘°λ€.[[Prototype]]
μ μ μ₯λλνλ‘ν νμ
μ κ°μ²΄ μμ± λ°©μμ μν΄ κ²°μ λλ€. μ¦, κ°μ²΄κ° μμ±λ λ κ°μ²΄ μμ±λ°©μμ λ°λΌνλ‘ν νμ
μ΄ κ²°μ λκ³[[Prototype]]
μ μ μ₯λλ€. ex) κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ κ°μ²΄μ νλ‘ν νμ μObject.prototype
μ΄κ³ μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄μ νλ‘ν νμ μμμ±μ ν¨μμ prototype νλ‘νΌν°
μ λ°μΈλ© λμ΄ μλ κ°μ²΄λ€.
λͺ¨λ κ°μ²΄λ νλμνλ‘ν νμ
μ κ°λλ€. κ·Έλ¦¬κ³ λͺ¨λνλ‘ν νμ
μ μμ±μ ν¨μμ μ°κ²°λμ΄ μλ€.
[[Prototype]]
λ΄λΆ μ¬λ‘―μλ μ§μ μ κ·Όν μ μμ§λ§, μ κ·Έλ¦Όμ²λΌ__proto__
μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ μμ μ νλ‘νΌν°μ μ κ·Όν μ μλ€.
그리κ³νλ‘ν νμ
μ μμ μconstructorνλ‘νΌν°
λ₯Ό ν΅ν΄ μμ±μ ν¨μμ μ κ·Όν μ μκ³ , μμ±μ
β μμ±μ ν¨μ κ°μ²΄μ [[Prototype]]
β μΌλ° κ°μ²΄μ [[Prototype]]
β μμ±μ ν¨μλ‘ μμ±λ κ°μ²΄μ [[Prototype]]
__proto__
μ κ·Όμ νλ‘νΌν°λͺ¨λ κ°μ²΄λ
__proto__
μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ μμ μ νλ‘ν νμ μ¦,[[Prototype]]
λ΄λΆ μ¬λ‘―μ κ°μ μ μΌλ‘ μ κ·Όν μ μλ€.
__proto__
λ μ κ·Όμ νλ‘νΌν°λ€.16.3.2 μ μ μ κ·Όμ νλ‘νΌν°μμ μ΄ν΄λ³Έ κ² μ²λΌ μ κ·Όμ νλ‘νΌν°λ μ체μ μΌλ‘λ κ°
[[Value]]
μ κ°μ§ μκ³ , μ κ·Όμ ν¨μ[[Get]]
[[Set]]
νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈλ‘ ꡬμ±λ νλ‘νΌν°λ€.
const obj = {};
const parent = { x : 1 };
// getter ν¨μμΈ get __proto__κ° νΈμΆλμ΄ obj κ°μ²΄μ νλ‘ν νμ
μ μ·¨λ
obj.__proto__;
// setter ν¨μμΈ set __proto__κ° νΈμΆλμ΄ obj κ°μ²΄μ νλ‘ν νμ
μ κ΅μ²΄
obj.__proto__ = parent;
console.log(obj.x_;
__proto__
λ μ κ·Όμ νλ‘νΌν°λ μμμ ν΅ν΄ μ¬μ©λλ€.
__proto__
μ κ·Όμ νλ‘νΌν°λ κ°μ²΄κ° μ§μ μμ νλ νλ‘νΌν°κ° μλλΌObject.prototype
μ νλ‘νΌν°μ΄λ€. λͺ¨λ κ°μ²΄λ μμμ ν΅ν΄Object.prototype.__proto__
μ κ·Όμ νλ‘νΌν°λ₯Ό μ¬μ©ν μ μλ€.
const person = { name: 'Lee' };
// person κ°μ²΄λ __proto__ νλ‘νΌν°λ₯Ό μμ νμ§ μλλ€.
console.log(person.hasOwnProperty('__proto__')); // false
// __proto__ νλ‘νΌν°λ λͺ¨λ κ°μ²΄μ νλ‘ν νμ
κ°μ²΄μΈ Object.prototypeμ μ κ·Όμ νλ‘νΌν°λ€.
console.log(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'));
// {get: Ζ, set: Ζ, enumerable: false, configurable: true}
// λͺ¨λ κ°μ²΄λ Object.prototypeμ μ κ·Όμ νλ‘νΌν° __proto__λ₯Ό μμλ°μ μ¬μ©ν μ μλ€.
console.log({}.__proto__ === Object.prototype); // true
__proto__
μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ νλ‘ν νμ
μ μ κ·Όνλ μ΄μ
[[Prototype]]
λ΄λΆ μ¬λ‘―μ κ°, μ¦νλ‘ν νμ
μ μ κ·ΌνκΈ° μν΄ μ κ·Όμ νλ‘νΌν°λ₯Ό μ¬μ©νλ μ΄μ λ μνΈ μ°Έμ‘°μ μν΄νλ‘ν νμ 체μΈ
μ΄ μμ±λλ κ²μ λ°©μ§νκΈ° μν΄μμ΄λ€.
const parent = {};
const child = {};
// child νλ‘ν νμ
μ parentλ‘ μ€μ
child.__proto__ = parent;
// parent νλ‘ν νμ
μ childλ‘ μ€μ
parent.__proto__ = child; // TypeError: Cyclic __proto__ value
λ¨λ°ν₯ λ§ν¬λ 리μ€νΈ
λ‘ κ΅¬νλμ΄μΌ νλ€. μ¦, νλ‘νΌν° κ²μ λ°©ν₯μ΄ νμͺ½λ°©ν₯μΌλ‘ νλ¬κ°μΌνλ€. νμ§λ§ μ μμ λ μλ‘κ° μλ‘λ₯Ό νλ‘ν νμ μ΄ λλ λΉμ μμ μΈ κ²½μ°, λ€μλ§ν΄μν μ°Έμ‘°
κ° λ§λ€μ΄μ Έμλ μλλ€.
__proto__
μ κ·Όμ νλ‘νΌν°λ₯Ό μ½λ λ΄μμ μ§μ μ¬μ©νλ κ²μ κΆμ₯νμ§ μλλ€.
__proto__
μ κ·Όμ νλ‘νΌν°λ ES5κΉμ§ ECMAScript μ¬μμ ν¬ν¨λμ§ μμ λΉνμ€μ΄μλ€. νμ§λ§ μΌλΆ λΈλΌμ°μ μμ__proto__
λ₯Ό μ§μ λΈλΌμ°μ νΈνμ±μ κ³ λ €νμ¬ ES6μμ__proto__
λ₯Ό νμ€μΌλ‘ μ±ννλ€.
νμ§λ§ μ½λ λ΄μμ__proto__
μ κ·Όμ νλ‘νΌν°λ₯Ό μ§μ μ¬μ©νλ κ²μ κΆμ₯νμ§ μλλ€. λͺ¨λ κ°μ²΄κ°__proto__
μ κ·Όμ νλ‘νΌν°λ₯Ό μ¬μ©ν μ μλ κ²μ μλκΈ° λλ¬Έμ΄λ€.μ§μ μμ
μ ν΅ν΄Object.prototype
μ μμλ°μ§ μλ κ°μ²΄λ₯Ό μμ±ν μλ μκΈ° λλ¬Έμ__proto__
μ κ·Όμνλ‘νΌν°λ₯Ό μ¬μ©ν μ μλ κ²½μ°κ° μλ€.
// objλ νλ‘ν νμ
체μΈμ μ’
μ μ΄λ€. λ°λΌμ Object.__proto__λ₯Ό μμλ°μ μ μλ€.
const obj = Object.create(null);
// objλ Object.__proto__λ₯Ό μμλ°μ μ μλ€.
console.log(obj.__proto__); // undefined
// λ°λΌμ __proto__λ³΄λ€ Object.getPrototypeOf λ©μλλ₯Ό μ¬μ©νλ νΈμ΄ μ’λ€.
console.log(Object.getPrototypeOf(obj)); // null
λ°λΌμ
__proto__ μ κ·Όμ νλ‘νΌν°
λμνλ‘ν νμ μ μ°Έμ‘°
λ₯Ό μ·¨λνκ³ μΆμ κ²½μ°μλObject.getPrototypeOf
λ©μλλ₯Ό μ¬μ©, νλ‘ν νμ μ κ΅μ²΄νκ³ μΆμ κ²½μ°μλObject.setPrototypeOf
λ©μλλ₯Ό μ¬μ©ν κ²μ κΆμ₯.
const obj = {};
const parent = { x : 1 };
// obj κ°μ²΄μ νλ‘ν νμ
μ μ·¨λ
Object.getPrototypeOf(obj); // obj.__proto__;
// obj κ°μ²΄μ νλ‘ν νμ
μ κ΅μ²΄
Object.setPrototypeOf(obj, parent); // obj.__proto__ = parent;
console.log(obj.x); // 1
ν¨μ κ°μ²΄λ§μ΄ μμ νλ prototype νλ‘νΌν°λ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ μ κ°λ¦¬ν¨λ€.
// ν¨μ κ°μ²΄λ prototype νλ‘νΌν°λ₯Ό μμ νλ€.
(function () {}).hasOwnProperty('prototype'); // true
// μΌλ° κ°μ²΄λ prototype νλ‘νΌν°λ₯Ό μμ νμ§ μλλ€.
({}).hasOwnProperty('prototype'); // false
Object.hasOwnProperty('prototype'); // true
prototype νλ‘νΌν°
λ μμ±μ ν¨μκ° μμ±ν κ°μ²΄(μΈμ€ν΄μ€)μνλ‘ν νμ
μ κ°λ¦¬ν¨λ€. μμ±μ ν¨μλ‘μ νΈμΆν μ μλ ν¨μ, μ¦ non-constructorμΈ νμ΄ν ν¨μμ ES6 λ©μλ μΆμ½ ννμΌλ‘ μ μν λ©μλλ prototype νλ‘νΌν°λ₯Ό μμ νμ§ μμΌλ©° νλ‘ν νμ λ μμ±νμ§ μλλ€.
// νμ΄ν ν¨μλ non-constructorλ€.
const Person = name => {
this.name = name;
};
// non-constructorλ prototype νλ‘νΌν°λ₯Ό μμ νμ§ μλλ€.
console.log(Person.hasOwnProperty('prototype')); // false
// non-constructorλ νλ‘ν νμ
μ μμ±νμ§ μλλ€.
console.log(Person.prototype); // undefined
// ES6μ λ©μλ μΆμ½ ννμΌλ‘ μ μν λ©μλλ non-constructorλ€.
const obj = {
foo() {}
};
// non-constructorλ prototype νλ‘ν¬ν°λ₯Ό μμ νμ§ μλλ€.
console.log(obj.foo.hasOwnProperty('prototype')) // false
// non-constructorλ νλ‘ν νμ
μ μμ±νμ§ μλλ€.
console.log(obj.foo.prototype); // undefined
λͺ¨λ κ°μ²΄κ° κ°μ§κ³ μλ(μλ°ν λ§νλ©΄ Object.prototypeμΌλ‘λΆν° μμλ°μ) protto μ κ·Όμ νλ‘ν¬ν°μ ν¨μ κ°μ²΄λ§μ΄ κ°μ§κ³ μλ prototype νλ‘νΌν°λ κ²°κ΅ λμΌν νλ‘ν νμ μ κ°λ¦¬ν¨λ€.
κ΅¬λΆ | μμ | κ° | μ¬μ© 주체 | μ¬μ© λͺ©μ |
---|---|---|---|---|
__proto__ μ κ·Όμ νλ‘νΌν° | λͺ¨λ κ°μ²΄ | νλ‘ν νμ μ μ°Έμ‘° | λͺ¨λ κ°μ²΄ | κ°μ²΄κ° μμ μ νλ‘ν νμ μ μ κ·Ό λλ κ΅μ²΄νκΈ° μν΄ μ¬μ© |
prototype μ κ·Όμ νλ‘νΌν° | constructor | νλ‘ν νμ μ μ°Έμ‘° | μμ±μ ν¨μ | μμ±μ ν¨μκ° μμ μ΄ μμ±ν κ°μ²΄(μΈμ€ν΄μ€)μ νλ‘ν νμ μ ν λΉνκΈ° μν΄ μ¬μ© |
β μμ±μ ν¨μλ‘ κ°μ²΄λ₯Ό μμ±ν ν _proto__
μ κ·Όμ νλ‘νΌν°μ prototype νλ‘νΌν°λ‘ νλ‘ν νμ
κ°μ²΄μ μ κ·Όν΄ λ³΄λ©΄
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}γ
const me = new Person('Lee');
// κ²°κ΅ person.prototypeκ³Ό me.__proto__λ κ²°κ΅ λμΌν νλ‘ν νμ
μ κ°λ¦¬ν¨λ€.
console.log(Person.prototype === me.__proto__); // true
λͺ¨λ
νλ‘ν νμ
μconstructor
νλ‘νΌν°λ₯Ό κ°λλ€. μ΄constructor
νλ‘νΌν°λprototype
νλ‘νΌν°λ‘ μμ μ μ°Έμ‘°νκ³ μλ μμ±μ ν¨μλ₯Ό κ°λ¦¬ν¨λ€.
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}
const me = new Person('Lee');
// me κ°μ²΄μ μμ±μ ν¨μλ Personμ΄λ€.
console.log(me.constructor === Person); // true
μ μμ μμ Person μμ±μ ν¨μλ me κ°μ²΄λ₯Ό μμ±νλ€ μ΄ λ me κ°μ²΄λ νλ‘ν νμ μ constructor νλ‘νΌν°λ₯Ό ν΅ν΄ μμ±μ ν¨μμ μ°κ²°λλ€. me κ°μ²΄μλ constructor νλ‘νΌν°κ° μμ§λ§ me κ°μ²΄μ νλ‘ν νμ μΈ Person.prototypeμλ constructor νλ‘νΌν°κ° μλ€. λ°λΌμ me κ°μ²΄λ νλ‘ν νμ μΈ Person.prototypeμ constructor νλ‘νΌν°λ₯Ό μμλ°μ μ¬μ©ν μ μλ€.
리ν°λ΄ νκΈ°λ²μ μν κ°μ²΄ μμ± λ°©μ
// κ°μ²΄ 리ν°λ΄
const obj = {};
// ν¨μ 리ν°λ΄
const add = function (a, b) { return a + b;};
// λ°°μ΄ λ¦¬ν°λ΄
const arr = [1,2,3];
// μ κ· ννμ 리ν°λ΄
const regExp = /is/ig;
리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄λ λ¬Όλ‘ νλ‘ν νμ μ μ‘΄μ¬νλ€. νμ§λ§ 리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄μ κ²½μ° νλ‘ν νμ μ constructor νλ‘νΌν°κ° κ°λ¦¬ν€λ μμ±μ ν¨μκ° λ°λμ κ°μ²΄λ₯Ό μμ±ν μμ±μ ν¨μλΌκ³ λ¨μ ν μ μλ€.
// obj κ°μ²΄λ Object μμ±μ ν¨μλ‘ μμ±ν κ°μ²΄κ° μλλΌ κ°μ²΄ 리ν°λ΄λ‘ μμ±νλ€.
const obj = {};
// νμ§λ§ obj κ°μ²΄μ μμ±μ ν¨μλ Object μμ±μ ν¨μλ€.
console.log(obj.constructor === Object); // true
μ μμ μ obj κ°μ²΄λ κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ κ°μ²΄μ΄λ€. νμ§λ§ objμ κ°μ²΄λ Object μμ±μ ν¨μμ constructor νλ‘νΌν°λ‘ μ°κ²°λμ΄ μλ€. κ·Έλ λ€λ©΄ κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ κ°μ²΄λ μ¬μ€ Object μμ±μ ν¨μλ‘ μμ±λλ κ²μ μλκΉ?
π Object μμ±μ ν¨μ ꡬν λ°©μ
2μμ Obejct μμ±μ ν¨μμ μΈμλ₯Ό μ λ¬νμ§ μκ±°λ undefined λλ nullμ μΈμλ‘ μ λ¬νλ©΄μ νΈμΆνλ©΄ λ΄λΆμ μΌλ‘λ μΆμ μ°μ°
OrdinaryObjectCreate
λ₯Ό νΈμΆνμ¬Object.Prototype
μ νλ‘ν νμ μΌλ‘ κ°λ λΉ κ°μ²΄λ₯Ό μμ±νλ€.
π‘ μΆμ μ°μ°
μΆμ μ°μ°μ ECMAScript μ¬μμμ λ΄λΆ λμμ ꡬν μκ³ λ¦¬μ¦μ ννν κ²μ΄λ€. ECMAScipt μ¬μμμ μ€λͺ μ μν΄ μ¬μ©λλ ν¨μμ μ μ¬ν μμ¬λ μ½λλΌκ³ μ΄ν΄νμ
// 1. new.targetμ΄ undefinedλ Objectκ° μλ κ²½μ°
// new.targetμ΄ λͺ¨λ₯΄κ² μΌλ©΄? μμ±μ ν¨μ
// μΈμ€ν΄μ€ -> Foo.prototype -> Object.prototype μμΌλ‘ νλ‘ν νμ
체μΈμ΄ μμ±λλ€.
class Foo extends Object {}
new Foo(); // Foo {}
// 2. Object μμ±μ ν¨μμ μν κ°μ²΄ μμ±
// μΈμκ° μ λ¬λμ§ μμμ λ μΆμ μ°μ° OrdinaryObjectCreateλ₯Ό νΈμΆνμ¬ λΉ κ°μ²΄λ₯Ό μμ±νλ€.
let obj = new Object();
console.log(obj); // {}
// 3. μΈμκ° μ λ¬λ κ²½μ°μλ κ°μ²΄λ₯Ό λ³ννλ€.
// Number κ°μ²΄ μμ±
obj = new Obeject(123);
console.log(obj); // Number {123}
// String κ°μ²΄ μμ±
obj = new Object('123');
console.log(obj); // String {"123"}
π κ°μ²΄ 리ν°λ΄ νκ°
κ°μ²΄ 리ν°λ΄μ΄ νκ°λ λλ μΆμ μ°μ°
OrdinaryObjectCreate
λ₯Ό νΈμΆνμ¬ λΉ κ°μ²΄λ₯Ό μμ±νκ³ νλ‘νΌν°λ₯Ό μΆκ°νλλ‘ μ μλμ΄ μλ€.
μ΄μ²λΌ Obejct μμ±μ ν¨μ νΈμΆκ³Ό κ°μ²΄ 리ν°λ΄μ νκ°λ μΆμ μ°μ°OrdinaryObjectCreate
λ₯Ό νΈμΆνμ¬ λΉ κ°μ²΄λ₯Ό μμ±νλ μ μμ λμΌνλnew.target
μ νμΈμ΄λ νλ‘νΌν°λ₯Ό μΆκ°νλ μ²λ¦¬ λ± μΈλΆλ΄μ©μ λ€λ₯΄λ€. λ°λΌμ κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ κ°μ²΄λ Obejct μμ±μ ν¨μκ° μμ±ν κ°μ²΄κ° μλλ€
12μ₯ 4.4μ Function μμ±μ ν¨μμμ μ΄ν΄λ³΄μλ―μ΄ Function μμ±μ ν¨μλ₯Ό νΈμΆνμ¬ μμ±ν ν¨μλ λ μ컬 μ€μ½νλ₯Ό λ§λ€μ§ μκ³ μ μν¨μμΈ κ²μ²λΌ μ€μ½νλ₯Ό μμ±νλ©° ν΄λ‘μ λ λ§λ€μ§ μλλ€. λ°λΌμ ν¨μ μ μΈλ¬Έ ν¨μ ννμμ νκ°νμ¬ ν¨μ κ°μ²΄λ₯Ό μμ±ν κ²μ Function μμ±μ ν¨μκ° μλλ€. νμ§λ§ constructor νλ‘νΌν°λ₯Ό ν΅ν΄ νμΈν΄ 보면 fooν¨μμ μμ±μ ν¨μλ Functionμμ±μ ν¨μλ€.
// foo ν¨μλ Function μμ±μ ν¨μλ‘ μμ±ν ν¨μ κ°μ²΄κ° μλλΌ ν¨μ μ μΈλ¬ΈμΌλ‘ μμ±νλ€.
function foo() {}
// νμ§λ§ constructor νλ‘νΌν°λ₯Ό ν΅ν΄ νμΈν΄λ³΄λ©΄ ν¨μ fooμ μμ±μ ν¨μλ Function μμ±μ ν¨μλ€.
console.log(foo.constructor === Function); // true
κ°μ²΄ 리ν°λ΄ νκΈ°λ² | μμ±μ ν¨μ | νλ‘ν νμ |
---|---|---|
κ°μ²΄ 리ν°λ΄ | Object | Object.prototype |
ν¨μ 리ν°λ΄ | Function | Function.prototype |
λ°°μ΄ λ¦¬ν°λ΄ | Array | Array.prototype |
μ κ· ννμ 리ν°λ΄ | RegExp | RexExp.prototype |
κ°μ²΄λ 리ν°λ΄ νκΈ°λ² λλ μμ±μ ν¨μμ μν΄ μμ± κ²°κ΅ λͺ¨λ κ°μ²΄ μμ±μ ν¨μμ μ°κ²°λμ΄μλ€.
νλ‘ν νμ μ μμ±μ ν¨μκ° μμ±λλ μμ μ λλΆμ΄ μμ±λλ€.
μμ±μ ν¨μλ‘μ νΈμΆν μ μλ ν¨μ, μ¦ construcotrλ ν¨μ μ μκ° νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ μμ μ νλ‘ν νμ λ λλΆμ΄ μμ±λλ€.
// ν¨μ μ μ(construcotr)κ° νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ μμ μ νλ‘ν νμ
λ λλΆμ΄ μμ±λλ€.
console.log(Person.prototyp); // {constructor: f}
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}
ν¨μ νΈμ΄μ€ν μ μν΄ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μ Person μμ±μ ν¨μ λ°νμ μ΄μ μ μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ λ¨Όμ μ€νλμ΄ ν¨μ κ°μ²΄ μμ± μ΄λ νλ‘ν νμ λ λλΆμ΄ μμ± μμ±λ νλ‘ν νμ μ Person μμ±μ ν¨μμ prototype νλ‘νΌν°μ λ°μΈλ©
// ν¨μλ‘μ νΈμΆν μ μλ ν¨μ, μ¦, non-constructorλ νλ‘ν νμ
μ΄ μμ±λμ§ μλλ€.
// νμ΄ν ν¨μλ non-constructorλ€.
const Person = name => {
this.name = name;
};
// non-constructorλ νλ‘ν νμ
μ΄ μμ±λμ§ μλλ€,
console.log(Person.prototype); // undefined
μμ±λ νλ‘ν νμ μ μ€μ§ constructor νλ‘νΌν°λ§μ κ°λ κ°μ²΄ νλ‘ν νμ λ κ°μ²΄μ΄κ³ λͺ¨λ κ°μ²΄λ νλ‘ν νμ μ κ°μ§λ―λ‘ νλ‘ν νμ λ μμ μ νλ‘ν νμ μ κ°λλ€. μμ±λ νλ‘ν νμ μ νλ‘ν νμ μ
Object.prototype
μ΄λ€.
λΉνΈμΈ μμ±μ ν¨μκ° μλ μ¬μ©μ μ μ μμ±μ ν¨μλ μμ μ΄ νκ°λμ΄ ν¨μ κ°μ²΄λ‘ μμ±λλ μμ μ νλ‘ν νμ λ λλΆμ΄ μμ±λλ©°, μμ±λ νλ‘ν νμ μ νλ‘ν νμ μ μΈμ λ
Object.prototype
μ΄λ€.
Object
String
Number
Function
Array
RegExp
Date
Promise
λ±κ³Ό κ°μ λΉνΈμΈ μμ±μ ν¨μλ μΌλ° ν¨μμ λ§μ°¬κ°μ§λ‘ λΉνΈμΈ μμ±μ ν¨μκ° μμ±λλ μμ μ νλ‘ν νμ μ΄ μμ± μμ±λ νλ‘ν νμ μ λΉνΈμΈ μμ±μ ν¨μμ prototype νλ‘νΌν°μ λ°μΈλ©λλ€.
λͺ¨λ λΉνΈμΈ μμ±μ ν¨μλ μ μ κ°μ²΄κ° μμ±λλ μμ μ μμ±λλ€.
β μ μ κ°μ²΄λ
μ μ κ°μ²΄
λ μ½λκ° μ€νλκΈ° μ΄μ λ¨κ³μ μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ μμ±λλ νΉμν κ°μ²΄λ€.
μ μ κ°μ²΄
λ ν΄λΌμ΄μΈνΈ μ¬μ΄λ νκ²½(λΈλΌμ°μ )μμλ window, μλ² μ¬μ΄λ(Node.js)μμλ global κ°μ²΄λ₯Ό μλ§νλ€.
μ μκ°μ²΄
λ νμ€ λΉνΈμΈ κ°μ²΄(Object, String, Number, Function, Array...)λ€κ³Ό νκ²½μ λ°λ₯Έ νΈμ€νΈ κ°μ²΄(ν΄λΌμ΄λνΈ Web API λλ Node.jsμ νΈμ€νΈ API), κ·Έλ¦¬κ³ var ν€μλλ‘ μ μΈν μ μ λ³μμ μ μ ν¨μλ₯Ό νλ‘νΌν°λ‘ κ°λλ€.Math
Reflect
JSON
μ μ μΈν νμ€ λΉνΈμΈ κ°μ²΄λ μμ±μ ν¨μλ€.// μ μ κ°μ²΄ windowλ λΈλΌμ°μ μ μ’ μμ μ΄λ―λ‘ μλ μ½λλ λΈλΌμ°μ νκ²½μμ μ€νν΄μΌ νλ€. // λΉνΈμΈ κ°μ²΄μΈ Objectλ μ μ κ°μ²΄ windowμ νλ‘νΌν°λ€. window.Object === Object // true
κ°μ²΄κ° μμ±λκΈ° μ΄μ μ μμ±μ ν¨μμ νλ‘ν νμ μ μ΄λ―Έ κ°μ²΄νλμ΄ μ‘΄μ¬νλ€. μ΄ν μμ±μ ν¨μ λλ 리ν°λ΄ νκΈ°λ²μΌλ‘ κ°μ²΄λ₯Ό μμ±νλ©΄ νλ‘νμ μ μμ±λ κ°μ²΄μ
[[Prototype]]
λ΄λΆ μ¬λ‘―μ ν λΉλλ€.
κ°μ²΄ μμ± λ°©μ
μ΄μ²λΌ λ€μν λ°©μμΌλ‘ μμ±λ λͺ¨λ κ°μ²΄λ λ°©μλ§λ€ μΈλΆμ μΈ κ°μ²΄ μμ± λ°©μμ μ°¨μ΄λ μμΌλ μΆμμ°μ°
OrdinaryObjectCreate
μ μν΄ μμ±λλ€λ 곡ν΅μ μ΄ μλ€.
μΆμμ°μ°OrdinaryObjectCreate
λ νμμ μΌλ‘ μμ μ΄ μμ±ν κ°μ²΄μ νλ‘ν νμ μ μΈμλ‘ μ λ¬λ°λλ€. κ·Έλ¦¬κ³ μμ μ΄ μμ±ν κ°μ²΄μ μΆκ°ν νλ‘νΌν° λͺ©λ‘μ μ΅μ μΌλ‘ μ λ¬ν μ μλ€.
μΆμμ°μ°OrdinaryObjectCreate
λ λΉ κ°μ²΄λ₯Ό μμ±ν ν, κ°μ²΄μ μΆκ°ν νλ‘νΌν° λͺ©λ‘μ΄ μΈμλ‘ μ λ¬λ κ²½μ° νλ‘νΌν°λ₯Ό κ°μ²΄μ μΆκ°νλ€. κ·Έλ¦¬κ³ μΈμλ‘ μ λ¬λ°μ νλ‘ν νμ μ μμ μ΄ μμ±ν κ°μ²΄μ[[Prototype]]
λ΄λΆ μ¬λ‘―μ ν λΉν λ€μ, μμ±ν κ°μ²΄λ₯Ό λ°ννλ€.
μ¦, νλ‘ν νμ μ μΆμ μ°μ°OrdinaryObjectCreate
μ μ λ¬λλ μΈμμ μν΄ κ²°μ μ΄ μΈμλ κ°μ²΄κ° μμ±λλ μμ μ κ°μ²΄ μμ± λ°©μμ μν΄ κ²°μ
μλ°μ€ν¬λ¦½νΈ μμ§μ κ°μ²΄ 리ν°λ΄μ νκ°νμ¬ κ°μ²΄λ₯Ό μμ±ν λ μΆμμ°μ°
OrdinaryObjectCreate
λ₯Ό νΈμΆνλ€.
μ΄λ μΆμ μ°μ°OrdinaryObjectCreate
μ μ λ¬λλ νλ‘ν νμμObject.prototype
μ΄λ€. μ¦, κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λλ κ°μ²΄μ νλ‘ν νμ μObject.prototype
μ΄λ€.
const obj = { x : 1 };
μμ μμ obj κ°μ²΄λ Object.prototypeμ νλ‘ν νμ μΌλ‘ κ°κ² λλ©° Object.prototypeμ μμλ°λλ€. obj κ°μ²΄λ constructor νλ‘νΌν°μ hasOwnProperty λ©μλλ±μ μμ νμ§λ μμμ§λ§ μμ μ νλ‘ν νμ μΈ Object.prototypeμ constructor νλ‘νΌν°μ hasOwnProperty λ©μλλ₯Ό μμ μ μμ°μΈ κ²μ²λΌ μμ λ‘κ² μ¬μ© κ°λ₯.
const obj = { x: 1 };
// κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ obj κ°μ²΄λ Object.prototypeμ μμλ°λλ€.
console.log(obj.constructor === Object); // true
console.log(obj.hasOwnProperty('x')); // true
Object μμ±μ ν¨μλ₯Ό μΈμ μμ΄ νΈμΆνλ©΄ λΉ κ°μ²΄ μμ±, Object μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ κ°μ²΄ 리ν°λ΄κ³Ό λ§μ°¬κ°μ§λ‘ μΆμ μ°μ°
OrdinaryObjectCreate
κ° νΈμΆλλ€. μ΄λ μΆμ μ°μ°OrdinaryObjectCreate
μ μ λ¬λλ νλ‘ν νμ μObject.prototype
μ΄λ€.
const obj = new Object();
obj.x = 1;
const obj = new Object();
obj.x = 1;
// Object μμ±μ ν¨μμ μν΄ μμ±λ obj κ°μ²΄λ Object.prototypeμ μμλ°λλ€.
console.log(obj.constructor === Object); // true
console.log(obj.hasOwnProperty('x'); // true
κ°μ²΄ 리ν°λ΄κ³Ό Object μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μμ μ°¨μ΄λ νλ‘νΌν°λ₯Ό μΆκ°νλ λ°©μμ μλ€. κ°μ²΄ 리ν°λ΄ λ°©μμ κ°μ²΄ 리ν°λ΄ λ΄λΆμ νλ‘νΌν°λ₯Ό μΆκ°νμ§λ§ Object μμ±μ ν¨μ λ°©μμ μΌλ¨ λΉ κ°μ²΄λ₯Ό μμ±ν μ΄ν νλ‘νΌν°λ₯Ό μΆκ°ν΄μΌ νλ€.
new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνμ¬ μΈμ€ν΄μ€λ₯Ό μμ±νλ©΄ λ€λ₯Έ κ°μ²΄ μμ± λ°©μκ³Ό λ§μ°¬κ°μ§λ‘ μΆμ μ°μ°
OrdinaryObjectCreate
κ° νΈμΆλλ€. μ΄λ μΆμ μ°μ°OrdinaryObjectCreate
μ μ λ€λΌλλ νλ‘ν νμ μ μμ±μ ν¨μμ prototype νλ‘νΌν°μ λ°μΈλ©λμ΄ μλ κ°μ²΄λ€. μ¦, μμ±μ ν¨μμ μν΄ μμ±λλ κ°κ²μ²΄μ νλ‘ν νμ μ μμ±μ ν¨μμ prototype νλ‘νΌν°μ λ°μΈλ©λμ΄ μλ κ°μ²΄λ€.
function Person(name) {
this.name = name;
}
const me = new Person('Lee');
νμ€ λΉνΈμΈ κ°μ²΄μΈ Object μμ±μ ν¨μμ λλΆμ΄ μμ±λ Object.prototypeμ λ€μν λΉνΈμΈ λ©μλλ₯Ό κ°κ³ μμ§λ§ μ¬μ©μ μ μ μμ±μ ν¨μ Personκ³Ό λλΆμ΄ μμ±λ νλ‘ν νμ Person.prototypeμ νλ‘νΌν°λ constructorλΏμ΄λ€.