νλ‘ν νμ
- μλ°μ€ν¬λ¦½νΈλ λͺ λ Ήν, ν¨μν, νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯μ μ§μνλ λ©ν° ν¨λ¬λ€μ νλ‘κ·Έλλ° μΈμ΄
- js μμ μμ νμ κ°μ μ μΈν λλ¨Έμ§ κ°λ€μ λͺ¨λ κ°μ²΄
μμκ³Ό νλ‘ν νμ
μμ(
inheritance
)μ ν΅ν΄ κ°μ²΄μ νλ‘νΌν°, λ©μλλ₯Ό λ€λ₯Έ κ°μ²΄κ° μμλ°μ κ·Έλλ‘ μ¬μ©ν μ μκ² λ¨.JavaScript
λ νλ‘ν νμ μ κΈ°λ°μΌλ‘ μμμ ꡬννμ¬ λΆνμν μ€λ³΅μ μ κ±°.νλ‘ν νμ μ¬μ©x
function Circle(radius){ this.radius = radius; this.getArea = function () { return Math.PI * this.radius ** 2; }; } const circle1 = new Circle(1); const circle2 = new Circle(2); console.log(circle1.getArea === circle2.getArea); // false
λμΌν λ©μλκ° μ€λ³΅ μμ±λλ€.
- νλ‘ν νμ κΈ°λ° μμ ꡬν
// μμ±μ ν¨μ function Circle(radius){ this.radius = radius; } Circle.prototype.getArea = function() { return Math.PI * this.radius ** 2; } const circle1 = new Circle(1); const circle2 = new Circle(2); console.log(circle1.getArea === circle2.getArea); // true
μμ μ μνλ₯Ό λνλ΄λ radius λ§ κ°λ³μ μΌλ‘ μμ getAreaλ©μλλ₯Ό μμλ°μμ μ¬μ©
μ½λ μ¬μ¬μ©μΌλ‘ μ€λ³΅ μ κ±°
νλ‘ν νμ κ°μ²΄
- νλ‘ν νμ κ°μ²΄λ κ°μ²΄κ° μμμ ꡬννκΈ° μν΄ μ¬μ©
- λͺ¨λ κ°μ²΄λ [[ Prototype ]] μ΄λΌλ λ΄λΆμ¬λ‘― κ°μ§κ³ , μ΄ κ°μ κ°μ²΄μ μμ± λ°©μμ μν΄ κ²°μ λ¨ (null μΌ μλ μμ)
μ 리 : κ°μ²΄κ° μμ±λ λ κ°μ²΄ μμ± λ°μμ λ°λΌ νλ‘ν νμ μ΄ κ²°μ λκ³ [[ Prototype ]]μ μ μ₯
- λͺ¨λ κ°μ²΄λ νλμ νλ‘ν νμ μ κ°μ§(null μΈ κ²½μ° νλ‘ν νμ μμ)
- λͺ¨λ νλ‘ν νμ μ μμ±μ ν¨μμ μ°κ²°λμ΄ μλ€.
μ 리
- [[ Prototype ]] μ§μ μ κ·Ό λΆκ°, κ°μ²΄λ __ proto __ μ κ·Όμ νλ‘νΌν° μ¬μ©νμ¬ μμ μ [[ Prototype ]] λ΄λΆμ¬λ‘―μ μ κ·Ό κ°λ₯
- νλ‘ν νμ μ constructor νλ‘νΌν°λ₯Ό ν΅ν΄ μμμ ν¨μμ μ κ·Ό κ°λ₯
- μμ±μ ν¨μλ prototype νλ‘νΌν°λ₯Ό ν΅ν΄ νλ‘ν νμ μ μ κ·Ό κ°λ₯
__ proto __ λ μ κ·Όμ νλ‘νΌν°
- μ κ·Όμ νλ‘νΌν°λ μ체μ μΌλ‘ κ°μ κ°μ§μ§ μκ³ μ κ·Όμ ν¨μλ₯Ό μ 곡 (
getter
/setter
)
const obj = {}; const parent = { x: 1 }; // getter ν¨μμΈ get __proto__κ° νΈμΆλμ΄ obj κ°μ²΄μ νλ‘ν νμ
μ μ·¨λ obj.__proto__; // setterν¨μμΈ set __proto__κ° νΈμΆλμ΄ obj κ°μ²΄μ νλ‘ν νμ
μ κ΅μ²΄ obj.__proto__ = parent; console.log(obj.x); // 1
__ proto __ μ κ·Όμ νλ‘νΌν°λ μμμ ν΅ν΄ μ¬μ©λ¨
- __ proto __ μ κ·Όμ νλ‘νΌν°λ κ°μ²΄κ° μ§μ μμ νλ κ²μ΄ μλλΌ Object.prototypeμ νλ‘νΌν° μ λλ€.
- Object κ°μ²΄λ μ΅μμ κ°μ²΄μ΄λ―λ‘ λͺ¨λ κ°μ²΄λ μμμ ν΅ν΄ __ 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
Object.prototype
λͺ¨λ κ°μ²΄λ νλ‘ν νμ μ κ³μΈ΅ κ΅¬μ‘°μΈ νλ‘ν νμ 체μΈμ λ¬Άμ¬ μλ€.
μλ°μ€ν¬λ¦½νΈ μμ§μ νλ‘νΌν°μ μ κ·Ό μ __ proto __ μ κ·Όμ νλ‘νΌν°κ° κ°λ¦¬ν€λ μ°Έμ‘°λ₯Ό λ°λΌ νλ‘ν νμ μ νλ‘νΌν°λ₯Ό μμ°¨μ μΌλ‘ κ²μ
__ proto __ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ μ κ·Όνλ μ΄μ ?
- μνΈ μ°Έμ‘°μ μν΄ νλ‘ν νμ 체μΈμ΄ μμ±λλ κ²μ λ°©μ§ νκΈ° μν΄
- νλ‘ν νμ μ λ¨λ°©ν₯ λ§ν¬λ 리νΈμ€λ‘ ꡬνλμ΄μΌ νλ€.
- μν μ°Έμ‘°νλ νλ‘ν νμ 체μΈμ΄ λ§λ€μ΄ μ§λ€λ©΄ νλ‘νΌν° κ²μ μ 무ν 루ν
__ proto __ μ κ·Όμ νλ‘νΌν° μ§μ μ¬μ© κΆμ₯ νμ§ μμ
- μ§μ μμμ ν΅ν΄
Object.prototype
λ₯Ό μμλ°μ§ μμ κ°μ²΄λ₯Ό μμ±ν μλ μμ.
// 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
νλ‘ν νμ
μ°Έμ‘° νμ μ : Object.getPrototypeOf
μ¬μ©
νλ‘ν νμ
κ΅μ²΄ νμ μ : Object.setPrototypeOf
μ¬μ©
ν¨μ κ°μ²΄μ prototype νλ‘νΌν°
prototype
νλ‘νΌν°λ ν¨μ κ°μ²΄λ§ κ°μ§prototype
νλ‘νΌν°λ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ μ κ°λ¦¬ν΄non-constructor
ν¨μ κ°μ²΄λprototype
κ°μ§μ§ μμ- __ proto __ μ κ·Όμ νλ‘νΌν°μ ν¨μ κ°μ²΄ λ§μ΄ κ°μ§κ³ μλ prototype νλ‘νΌν°λ κ²°κ΅ λμΌν νλ‘νΌνμ
μ κ°λ¦¬ν¨λ€*
- __ proto __
- λͺ¨λ κ°μ²΄κ° μμ
- κ°μ²΄κ° μμμ νλ‘ν νμ μ μ κ·Ό λλ κ΅μ²΄ νκΈ° μν΄ μ¬μ©
- prototype νλ‘νΌν°
- constructor μμ
- μμ±μ ν¨μκ° μ¬μ© 주체
- μμ±μ ν¨μκ° μμ μ΄ μμ±ν κ°μ²΄μ νλ‘ν νμ μ ν λΉνκΈ°μν΄ μ¬μ©
- __ proto __
// μμ±μ ν¨μ function Person(name) { this.name = name; } const me = new Person('Lee'); // κ²°κ΅ Person.prototypeκ³Ό me.__proto__λ κ²°κ΅ λμΌν νλ‘ν νμ
μ κ°λ¦¬ν¨λ€. console.log(Person.prototype === me.__proto__); // true
constructor
- λͺ¨λ νλ‘ν νμ
μ
constructor
νλ‘νΌν°λ₯Ό κ°μ§λ€. constructor
νλ‘νΌν°λ μμ μ μ°Έμ‘°νκ³ μλ μμ±μ ν¨μλ₯Ό κ°λ¦¬λ¦Ό- ν¨μ κ°μ²΄ (μμ±μ ν¨μ)κ° μμ±λ λ μ°κ²° μ΄λ£¨μ΄μ§
// μμ±μ ν¨μ function Person(name) { this.name = name; } const me = new Person('Lee'); // me κ°μ²΄μ μμ±μ ν¨μλ Personμ΄λ€. console.log(me.constructor === Person); // true
리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄μ μμ±μ ν¨μμ νλ‘ν νμ
new
μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνμ¬ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ°μ²΄ μμ±νλ κ²½μ° =>constructor
κ° ν΄λΉ κ°μ²΄λ₯Ό μμ±ν μμ±μ ν¨μ κ°λ¦¬ν΄- 리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄κ²½μ°
constructor
κ° κ°λ¦¬ν€λ μμ±μ ν¨μκ° κ°μ²΄λ₯Ό μμ±ν μμ±μ ν¨μλΌκ³ λ¨μ μ§μ μ μλ€.
// obj κ°μ²΄λ Object μμ±μ ν¨μλ‘ μμ±ν κ°μ²΄κ° μλλΌ κ°μ²΄ 리ν°λ΄λ‘ μμ±νλ€. const obj = {}; // νμ§λ§ obj κ°μ²΄μ μμ±μ ν¨μλ Object μμ±μ ν¨μλ€. console.log(obj.constructor === Object); // true
- 리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄λ μμμ μν΄ νλ‘ν νμ
νμ
νλ‘ν νμ μ μμ±μ ν¨μμ λλΆμ΄ μμ±λλ©° prototype, constructor νλ‘νΌν°μ μν΄ μ°κ²°λμ΄μκΈ° λλ¬Έ
리ν°λ΄ νκΈ°λ²μΌλ‘ μμ±λ κ°μ²΄λ κ°μμ μμ±μ ν¨μ κ°λλ€.
μ¦, νλ‘ν νμ
κ³Ό μμ±μ ν¨μλ λ¨λ
μΌλ‘ μ‘΄μ¬ν μ μκ³ μΈμ λ μ(pair
)λ‘ μ‘΄μ¬
- 리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄μ νλ‘ν νμ
리ν°λ΄ νκΈ°λ² | μμ±μ ν¨μ | νλ‘ν νμ |
---|---|---|
κ°μ²΄ 리ν°λ΄ | Object |
Object.prototype |
ν¨μ 리ν°λ΄ | Function |
Function.prototype |
λ°°μ΄ λ¦¬ν°λ΄ | Array |
Array.prototype |
μ κ· ννμ 리ν°λ΄ | RegExp |
RegExp.prototype |
νλ‘ν νμ μ μμ±μμ
νλ‘ν νμ μ μμ±μ ν¨μκ° μμ±λλ μμ μ λλΆμ΄ μμ± λ¨
μμ±μ ν¨μλ μ¬μ©μ μ μ μμ±μ ν¨μμ μλ°μ€ν¬λ¦½νΈκ° κΈ°λ³Έ μ 곡νλ λΉνΈμΈ μμ±μ ν¨μλ‘ κ΅¬λΆν μ μλ€.
μ¬μ©μ μ μ μμ±μ ν¨μμ νλ‘ν νμ μμ± μμ
- μμ±μ ν¨μλ‘μ νΈμΆν μ μλ ν¨μ, μ¦
constructor
λ ν¨μ μ μκ° νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ μμ μ νλ‘ν νμ λ λλΆμ΄ μμ± non-constructor
λ νλ‘ν νμ μ΄ μμ±λμ§ μλλ€.
// ν¨μ μ μ(constructor)κ° νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ μμ μ νλ‘ν νμ
λ λλΆμ΄ μμ±λλ€. console.log(Person.prototype); // {constructor: Ζ} // μμ±μ ν¨μ function Person(name) { this.name = name; } /* ---------------------------------------------- */ // νμ΄ν ν¨μλ non-constructorλ€. const Person = name => { this.name = name; }; // non-constructorλ νλ‘ν νμ
μ΄ μμ±λμ§ μλλ€. console.log(Person.prototype); // undefined
μμ±λ νλ‘ν νμ μ μ€μ§
constructor
νλ‘νΌν°λ§μ κ°λ κ°μ²΄.νλ‘ν νμ λ κ°μ²΄μ΄κ³ , λͺ¨λ κ°μ²΄λ νλ‘ν νμ μ κ°μ§λ―λ‘ νλ‘ν νμ λ μμ μ νλ‘ν νμ μ κ°μ§.(
Object.prototype
)
λΉνΈμΈ μμ±μ ν¨μμ νλ‘ν νμ μμ± μμ
- λͺ¨λ λΉνΈμΈ μμ±μ ν¨μλ μ μ κ°μ²΄κ° μμ±λλ μμ μ μμ±λ¨
- μμ±λ νλ‘ν νμ μ λΉνΈμΈ μμ±μ ν¨μμ prototype νλ‘νΌν°μ λ°μΈλ© λλ€.
μ μ κ°μ²΄
- μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ μμ±λλ νΉμν κ°μ²΄
- λΈλΌμ°μ μμλ
window
, node.js μμλglobal
- μ μκ°μ²΄λ νμ€ λΉνΈμΈ κ°μ²΄(
Object
,String
,Number
...), νΈμ€νΈ κ°μ²΄ (webAPI
...), var ν€μλλ‘ μ μΈν μ μλ³μμ μ μν¨μλ₯Ό νλ‘νΌν°λ‘ κ°λλ€.
Math, Reflcect, JSON μ μ μΈν νμ€ λΉνΈμΈ κ°μ²΄λ λͺ¨λ μμ±μ ν¨μ
- κ°μ²΄κ° μμ±λκΈ° μ΄μ μ μμ±μ ν¨μμ νλ‘ν νμ μ μ΄λ―Έ κ°μ²΄ν λμ΄ μ‘΄μ¬
- μ΄ ν μμ±μ ν¨μ λλ 리ν°λ΄λ‘ κ°μ²΄λ₯Ό μμ±νλ©΄ νλ‘ν νμ μ μμ±λ κ°μ²΄μ [[ Prototype ]] λ΄λΆ μ¬λ‘―μ ν λΉλλ€.
κ°μ²΄ μμ± λ°©μκ³Ό νλ‘ν νμ μ κ²°μ
- κ°μ²΄ μμ±λ°©μ
- κ°μ²΄ 리ν°λ΄
Object
μμ±μ ν¨μ- μμ±μ ν¨μ
Object.create
λ©μλ- ν΄λμ€(
ES6
)
κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ κ°μ²΄μ νλ‘ν νμ
- κ°μ²΄ 리ν°λ΄μ νκ°νμ¬ κ°μ²΄λ₯Ό μμ±ν λ
OrdinaryObjectCreate
μObject.prototype
μ μ λ¬νμ¬ μ°μ°ν¨.
const obj = { x: 1 }; // κ°μ²΄ 리ν°λ΄μ΄ νκ°λλ©΄μ Object μμ±μ ν¨μμ Object.prototypeκ³Ό μμ±λ κ°μ²΄ μ¬μ΄μ μ°κ²° λ§λ€μ΄μ§ // κ°μ²΄ 리ν°λ΄μ μν΄ μμ±λ obj κ°μ²΄λ Object.prototypeμ μμ λ°λλ€. console.log(obj.constructor === Object); // true console.log(obj.hasOwnProperty("x")); // true
Object μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄μ νλ‘ν νμ
- Object μμ±μ ν¨μμ μν΄ μμ±λλ νλ‘ν νμ
μ
Object.prototype
- 리ν°λ΄ μμ±λ°©μκ³Ό μ°¨μ΄μ μ νλ‘νΌν°λ₯Ό μΆκ°νλ λ°©μ
- 리ν°λ΄ λ°©μμ κ°μ²΄ 리ν°λ΄ λ΄λΆμ νλ‘νΌν° μΆκ°
- Object μμ±μ ν¨μ λ°©μμ λΉ κ°μ²΄λ₯Ό μμ±ν μ΄ν νλ‘νΌν° μΆκ°
μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄μ νλ‘ν νμ
new
μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνμ¬ μΈμ€ν΄μ€λ₯Ό μμ±ν λOrdinaryObjectCreate
μ μμ±μ ν¨μμprototype
νλ‘νΌν°μ λ°μΈλ©λμ΄ μλ κ°μ²΄λ₯Ό μ λ¬νμ¬ μ°μ°ν¨.- μμ±μ ν¨μ μμ±λ νλ‘ν νμ κ°μ²΄μ νλ‘νΌν°λ constructorλΏ
- μμ±λ νλ‘ν νμ κ°μ²΄( μμ±μν¨μ.prototype)μ νλ‘νΌν°λ₯Ό μΆκ° / μμ ν μ μκ³ μ΄ νλ‘νΌν°λ μΈμ€ν΄μ€κ° μμλ°μ (νλ‘ν νμ 체μΈμ λ°μ)
νλ‘ν νμ 체μΈ
κ°μ²΄μ νλ‘νΌν°(λ©μλ ν¬ν¨)μ μ κ·Όνλ €κ³ ν λ ν΄λΉ κ°μ²΄μ μ κ·Όνλ €λ νλ‘νΌν°κ° μλ€λ©΄,
[[Prototype]]
λ΄λΆ μ¬λ‘―μ μ°Έμ‘°λ₯Ό λ°λΌ μμ μ λΆλͺ¨ μν μ νλ νλ‘ν νμ μ νλ‘νΌν°λ₯Ό μμ°¨μ μΌλ‘ κ²μνλ κ²μ λ§ν¨νλ‘ν νμ 체μΈμ μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ μμμ ꡬννλ λ©μ»€λμ¦
νλ‘ν νμ 체μΈμ μ΅μμμ μμΉνλ κ°μ²΄λ Object.prototype
μ¦, λͺ¨λ κ°μ²΄λ Object.prototypeμ μμ λ°μ
Object.prototypeμμλ νλ‘νΌν° κ²μνμ§ λͺ»νλ©΄
undefined
λ°νμ 리
νλ‘ν νμ μ²΄μΈ : κ³μΈ΅μ μΈ κ΅¬μ‘°μ κ°μ²΄μ μμκ³Ό νλ‘νΌν° κ²μμ μν λ©μ»€λμ¦
μ€μ½ν μ²΄μΈ : ν¨μμ μ€μ²© κ΄κ³λ‘ μ΄λ£¨μ΄μ§ μ€μ½νμ κ³μΈ΅μ ꡬ쑰μμ μλ³μ κ²μμ μν λ©μ»€λμ¦
μ€λ²λΌμ΄λ©κ³Ό νλ‘νΌν° μλμ
μ©μ΄ μ 리
μ€λ²λΌμ΄λ©* (
overriding
): μμ ν΄λμ€κ° κ°μ§κ³ μλ λ©μλλ₯Ό νμ ν΄λμ€κ° μ¬μ μ νμ¬ μ¬μ©νλ λ°©μμ€λ²λ‘λ©*(
overloading
) : ν¨μμ΄λ¦μ λμΌνμ§λ§ 맀κ°λ³μμ νμ λλ κ°μκ° λ€λ₯Έ λ©μλλ₯Ό ꡬννκ³ , ꡬλ³νμ¬ νΈμΆνλ λ°©μνλ‘νΌν° μλμ*(
property shadowing
) : μμ κ΄κ³μ μν΄ νλ‘νΌν°κ° κ°λ €μ§λ νμμλ°μ€ν¬λ¦½νΈλ μ€λ²λ‘λ© μ§μx, κ·Έλ¬λ arguments κ°μ²΄ μ¬μ©νμ¬ κ΅¬νκ°λ₯
νλ‘ν νμ νλ‘νΌν°λ₯Ό λ³κ²½ λλ μμ νλ €λ©΄ νμ κ°μ²΄λ₯Ό ν΅ν΄ νλ‘ν νμ 체μΈμΌλ‘ μ κ·Όνλ κ²μ΄ μλλΌ νλ‘ν νμ μ μ§μ μ κ·Όν΄μΌν¨
// νλ‘ν νμ
체μΈμ ν΅ν΄ νλ‘ν νμ
λ©μλκ° μμ λμ§ μλλ€. delete me.sayHello; // νλ‘ν νμ
λ©μλκ° νΈμΆλλ€. me.sayHello(); // Hi! My name is Lee /* ------------------------------------ */ // μ§μ μ κ·Όνμ¬ λ³κ²½ / μμ κ°λ₯ // νλ‘ν νμ
λ©μλ λ³κ²½ Person.prototype.sayHello = function () { console.log(`Hey! My name is ${this.name}`); }; me.sayHello(); // Hey! My name is Lee // νλ‘ν νμ
λ©μλ μμ delete Person.prototype.sayHello; me.sayHello(); // TypeError: me.sayHello is not a function
νλ‘ν νμ κ΅μ²΄
νλ‘ν νμ μ μμμ λ€λ₯Έ κ°μ²΄λ‘ λ³κ²½ κ°λ₯ -> λΆλͺ¨ κ°μ²΄μΈ νλ‘ν νμ μ λμ μΌλ‘ λ³κ²½ κ°λ₯
μμ±μ ν¨μ λλ μΈμ€ν΄μ€μ μν΄ κ΅μ²΄κ°λ₯
νλ‘ν νμ μ κ΅μ²΄λ₯Ό ν΅ν΄ μμ κ΄κ³λ₯Ό λμ μΌλ‘ λ³κ²½νλ κ²μ κ½€λ λ²κ±°λ‘μ°λ―λ‘, μ§μ κ΅μ²΄νμ§ μλ κ²μ΄ νΈλ¦¬ν¨κ³Ό μμ μ± μΈ‘λ©΄μμ μ’μ.
instanceof μ°μ°μ
κ°μ²΄ instanceof μμ±μ ν¨μ
μ°λ³μ μμ±μ ν¨μμ
prototype
μ λ°μΈλ©λ κ°μ²΄κ° μ’λ³μ νλ‘ν νμ μ²΄μΈ μμ μ‘΄μ¬νλ©΄ trueλ‘ νκ°λκ³ μλκ²½μ° falseλ‘ νκ° λ¨μμ±μ ν¨μμ μν΄ νλ‘ν νμ μ΄ κ΅μ²΄λμ΄λ μμ±μ ν¨μμ
prototype
νλ‘νΌν°μ μ°κ²°μ νκ΄΄λμ§ μμΌλ―λ‘instanceof
μ°μ°μλ μ μ λμ
const Person = (function () { function Person(name) { this.name = name; } // μμ±μ ν¨μμ prototype νλ‘νΌν°λ₯Ό ν΅ν΄ νλ‘ν νμ
μ κ΅μ²΄ Person.prototype = { sayHello() { console.log(`Hi! My name is ${this.name}`); } }; return Person; }()); const me = new Person('Lee'); // constructor νλ‘νΌν°μ μμ±μ ν¨μ κ°μ μ°κ²°μ νκ΄΄λμ΄λ instanceofλ μλ¬΄λ° μν₯μ λ°μ§ μλλ€. console.log(me.constructor === Person); // false // Person.prototypeμ΄ me κ°μ²΄μ νλ‘ν νμ
μ²΄μΈ μμ μ‘΄μ¬νλ―λ‘ trueλ‘ νκ°λλ€. console.log(me instanceof Person); // true // Object.prototypeμ΄ me κ°μ²΄μ νλ‘ν νμ
μ²΄μΈ μμ μ‘΄μ¬νλ―λ‘ trueλ‘ νκ°λλ€. console.log(me instanceof Object); // true
μ μ νλ‘νΌν°/λ©μλ
μ μ (
static
) νλ‘νΌν° / λ©μλλ μμ±μ ν¨μλ‘ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ μ°Έμ‘° / νΈμΆ ν μ μλ νλ‘νΌν° λ©μλλ₯Ό λ§νλ€.μ μ νλ‘νΌν°/λ©μλλ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ‘ μ°Έμ‘°/νΈμΆν μ μμ.
μ μ νλ‘νΌν°/λ©μλλ μΈμ€ν΄μ€μ νλ‘ν νμ 체μΈμ μν νλ‘νΌν°/λ©μλκ° μλλ―λ‘ μΈμ€ν΄μ€λ‘ μ κ·Όν μ μμ.
μΈμ€ν΄μ€/νλ‘ν νμ λ©μλ λ΄μμ
this
λ₯Ό μ¬μ©νμ§ μλλ€λ©΄ μ μ λ©μλλ‘ λ³κ²½ν΄λ 무방νλ€.
νλ‘νΌν° μ‘΄μ¬ νμΈ
in
μ°μ°μ
in
μ°μ°μλ κ°μ²΄ λ΄μ νΉμ νλ‘νΌν°κ° μ‘΄μ¬νλμ§ μ¬λΆλ₯Ό νμΈνλ€.
/** * key: νλ‘νΌν° ν€λ₯Ό λνλ΄λ λ¬Έμμ΄ * object: κ°μ²΄λ‘ νκ°λλ ννμ */ key in object
in
μ°μ°μλ κ°μ²΄μ νλ‘νΌν° λΏλ§μλλΌ κ°μ²΄κ° μμλ°μ λͺ¨λ νλ‘ν νμ μ νλ‘νΌν°λ₯Ό νμΈνλ€. (Object.prototypeμμ μμλ°μ κ²λ trueλ‘ νλ¨)
console.log('toString' in person); // true
Object.prototype.hasOwnProperty
λ©μλ
- κ°μ²΄ κ³ μ μ νλ‘νΌν°(μμ λ°μ νλ‘ν νμ μ μΈ)λ§ νμΈνλ λ°©λ².
console.log(person.hasOwnProperty('toString')); // false
νλ‘νΌν° μ΄κ±°
for ... in
λ¬Έ
/* key: propertyλ₯Ό ν λΉ λ°μ λ³μ object: μ΄κ±°ν κ°μ²΄ */ for (const key in object) { ... }
νλ‘νΌν°μ κ°μλ§νΌ μννμ¬ λ³μ μ μΈλ¬Έ(
key
)μμ μ μΈν λ³μμ νλ‘νΌν° ν€λ₯Ό ν λΉ.μν λμμ κ°μ²΄ νλ‘νΌν° λΏλ§ μλλΌ μμλ°μ νλ‘ν νμ μ νλ‘νΌν°κΉμ§ μ΄κ±°
[[Enumerable]]
μ κ°μ΄false
μ΄λ©΄ μ΄κ±°νμ§ μμ.ν€κ° μ¬λ²μΈ νλ‘νΌν° λν μ΄κ±°νμ§ μμ.
λλΆλΆμ λͺ¨λ λΈλΌμ°μ λ μμλ₯Ό 보μ₯νκ³ μ«μ(μ¬μ€μ λ¬Έμμ΄)μΈ νλ‘νΌν° ν€μ λν΄μλ μ λ ¬μ μ€μνμ§λ§, μλ
for ... in
λ¬Έμ μμλ₯Ό 보μ₯νμ§ μμΌλ―λ‘ μ£Όμ.λ°°μ΄μλ
for ... in
μ΄ μλfor
,for ... of
,Array.prototype.forEach
λ±μ λ©μλ κΆμ₯.
// μμλ°μ νλ‘νΌν°λ μ μΈνκ³ κ°μ²΄ μμ μ νλ‘νΌν°λ§ μ΄κ±°νλ λ°©λ² const person = { name: 'Lee', address: 'Seoul', __proto__: { age: 20 } }; for (const key in person) { // κ°μ²΄ μμ μ νλ‘νΌν°μΈμ§ νμΈνλ€. if (!person.hasOwnProperty(key)) continue; console.log(key + ': ' + person[key]); } // name: Lee // address: Seoul
νλ‘ν νμ μ²΄μΈ μμ μ‘΄μ¬νλ λͺ¨λ νλ‘ν νμ μ νλ‘νΌν° μ€μμ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ
[[Enumerable]]
μ κ°μ΄true
μΈ νλ‘νΌν°λ₯Ό μννλ©° μ΄κ±°νλ λ°©λ².
Object.keys/values/entries
λ©μλ
Object.keys
: κ°μ²΄ μμ μ μ΄κ±° κ°λ₯ν νλ‘νΌν° ν€λ₯Ό λ°°μ΄λ‘ λ°ν.Object.values
: κ°μ²΄ μμ μ μ΄κ±° κ°λ₯ν νλ‘νΌν° κ°μ λ°°μ΄λ‘ λ°ν.Object.entries
: κ°μ²΄ μμ μ μ΄κ±° κ°λ₯ν νλ‘νΌν° ν€μ κ°μ μμ λ°°μ΄μ λ°°μ΄λ‘ λ°ν.
κ°μ²΄ μμ κ³ μ μ νλ‘νΌν° μ€μμ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ
[[Enumerable]]
μ κ°μ΄true
μΈ μ΄κ±°νλ λ°©λ².
'javascript > π study' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[4μ£Όμ°¨ μ€ν°λ] 21μ₯- λΉνΈμΈ κ°μ²΄ (0) | 2022.02.23 |
---|---|
[4μ£Όμ°¨ μ€ν°λ] 20μ₯- strict mode (0) | 2022.02.23 |
[3μ£Όμ°¨ μ€ν°λ]18μ₯-ν¨μμ μΌκΈκ°μ²΄ (0) | 2022.02.14 |
[3μ£Όμ°¨ μ€ν°λ] 17μ₯-μμ±μ ν¨μ (0) | 2022.02.14 |
[3μ£Όμ°¨ μ€ν°λ] 16μ₯ νλ‘νΌν°, μ΄νΈλ¦¬λ·°νΈ (0) | 2022.02.14 |
λκΈ