π― __proto__ μ κ·Όμ νλ‘νΌν°
λΈλΌμ°μ μ½μμ°½μ κ°μ²΄λ₯Ό μμ±νκ³ μ°μ΄λ³΄λ©΄ λ΄κ° μ λ ₯ν νλ‘νΌν° μΈμλ [[Prototype]]: ObjectλΌλ νλͺ©μ΄ κ°μ΄ λ¬λ€.
μ΄λ μλ₯Ό νΌμ³λ³΄λ©΄ λκ° μλ© λμ€λλ°, μ΄κ² νλ‘ν νμ μ΄λ€.
__proto__λ μ κ·Όμ νλ‘νΌν°
μ¬κΈ°μ [[Prototype]]μ μλ νλ‘ν νμ μ μ κ·ΌνκΈ° μν΄ μ¬μ©λλ κ²μ΄ __proto__ μ κ·Όμ νλ‘νΌν°μ΄λ€.
μ κ·Όμ νλ‘νΌν°λ μ체μ μΈ κ°μ κ°μ§κ³ μλκ² μλλΌ, get / setμ κ°μ ν¨μλ₯Ό νΈμΆνμ¬ μ¬μ©λλ€.
const obj = {}
const parent = {x: 1}
obj.__proto__ // μ¬κΈ°μλ get __object__λ₯Ό νΈμΆνκ³
obj.__proto__ = parent // μ¬κΈ°μλ set __object__λ₯Ό νΈμΆν¨
console.log(obj.x) // 1
__proto__ λ μμμ ν΅ν΄ μ¬μ©λ¨
__proto__ λ κ°μ²΄κ° μ§μ μμ νλ νλ‘νΌν°κ° μλλΌ, Object.prototypeμ νλ‘νΌν°μ΄λ€.
κ·Έλ κΈ°λλ¬Έμ μμμ ν΅ν΄ Object.prototype.__proto__λ₯Ό μ¬μ©ν μ μλ€.
const obj = {};
// objλ μ§μ __proto__ νλ‘νΌν°λ₯Ό κ°μ§κ³ μμ§ μμ
console.log(obj.hasOwnProperty('__proto__')); // false
// νμ§λ§ __proto__λ₯Ό μ¬μ©ν μ μμ
console.log(obj.__proto__ === Object.prototype); // true
// __proto__λ μ€μ λ‘ Object.prototypeμ νλ‘νΌν°μ
console.log(Object.prototype.hasOwnProperty('__proto__')); // true
// μ¦, μ΄λ° ννλ₯Ό κ°μ§λ κ±°μ
obj ---> obj.__proto__ ---> Object.prototype
// obj μ체λ λΉμ΄μμ {}
// objλ Object.prototypeμ μμλ°μ
// Object.prototypeμ __proto__ getter/setterκ° μ μλμ΄ μμ
μ’ λ μ 리λ₯Ό νμλ©΄
- λͺ¨λ κ°μ²΄λ Object.prototypeμ μμλ°μ
- __proto__λ Object.prototypeμ μ μλ νΉλ³ν μ κ·Όμ νλ‘νΌν°
- λͺ¨λ κ°μ²΄λ μ΄ __proto__λ₯Ό μμλ°μ μ¬μ©
- μ΄λ° λ°©μμΌλ‘ νλ‘ν νμ μ²΄μΈ μ‘°μμ΄ κ°λ₯
μ μ΄λ κ² λΆνΈνκ² μ°λμ§? = νλ‘ν νμ 체μΈμ΄ μμ±λλ κ²μ λ°©μ§νλ €κ΅¬
const parent = {}
const child = {}
child.__proto__ = parent
parent.__proto__ = child // TypeError: Cyclic __proto__ value
μμ μμμ²λΌ μλ‘μ νλ‘ν νμ
μ μ€μ νλ©΄ νμ
μλ¬κ° λ°μνλ€.
μ΄λ° νμμ λ°©μ§νκΈ° μν΄μ νλ‘ν νμ
체μΈμ λ¨λ°©ν₯ λ§ν¬λ리μ€νΈ ννλ‘ κ΅¬νμ΄ λμ΄μΌ νλ€. μν μ°Έμ‘°λ₯Ό λ§κΈ° μν΄μ __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄μ μ κ·Όνκ³ κ΅μ²΄νλλ‘ κ΅¬νμ΄ λμ΄μλ κ²..
μ¬μ€μ κ·Όλ°, κΆμ₯λμ§ μμ
ES5κΉμ§λ __proto__ μ κ·Όμλ ν¬ν¨λμ§ μμ λΉνμ€μ΄μλ€. ES6μ μμμΌ μ§μνλ κΈ°λ₯μ΄μ§λ§, κΆμ₯λμ§λ μλλ€.
μλνλ©΄, λͺ¨λ κ°μ²΄κ° __proto__λ₯Ό μ¬μ©ν μ μλκ² μλκΈ° λλ¬Έμ...
const obj = Object.create(null)
console.log(obj.__proto__) // undefined
κ·Έλμ κΆμ₯λλ λ°©λ²μ
- μ°Έμ‘°νκ³ μΆμ λ : Object.getPrototypeOf
- κ΅μ²΄νκ³ μΆμ λ: Object.setPrototypeOf
const obj = {}
const parent = {x : 1}
Object.getPrototypeOf(obj) // objμ νλ‘ν νμ
μ κ°μ Έμ΄
Object.setPrototypeOf(obj, parent) // objμ νλ‘ν νμ
μ parentλ‘ κ΅μ²΄
console.log(obj.x) // 1
π ν¨μ κ°μ²΄μ prototype νλ‘νΌν°
ν¨μλ κ°μ²΄μ΄λ―λ‘ prototype νλ‘νΌν°λ₯Ό κ°μ§λ€.
μ΄λ ν¨μ κ°μ²΄κ° μμ νλ prototype νλ‘νΌν°λ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ μ κ°λ¦¬ν¨λ€.
(function () {}).hasOwnProperty('prototype')
κ·Έλμ μ΄λ°μμΌλ‘ λΉν¨μλ prototypeμ κ°μ§λ€.
μλνλ©΄ μ΄ ν¨μλ₯Ό λμ€μ μμ±μ ν¨μλ‘ μ¬μ©ν μ μκΈ° λλ¬Έμ
νμ§λ§, μΌλ° κ°μ²΄μ κ²½μ°μλ prototype νλ‘νΌν°λ₯Ό κ°μ§μ§ μλλ€.
(κ°μ²΄μ κ²½μ° __proto__ λ κ°μ§μ§λ§, prototype νλ‘νΌν°λ κ°μ§μ§ μμ)
const obj = {};
console.log(obj.prototype); // undefined
κ·Έλ¦¬κ³ , ν¨μλ μμ±μ ν¨μλ‘ μ¬μ©ν μ μκΈ° λλ¬Έμ prototype νλ‘νΌν°λ₯Ό κ°μ§λλ°,
λ§μ½ μμ±μ ν¨μλ‘ μ¬μ©ν μ μλ ν¨μ(non-constructor)μΈ νμ΄ν ν¨μμ ES6 λ©μλ μΆμ½ ννμΌλ‘ μ μλ λ©μλλ prototype νλ‘νΌν°λ₯Ό κ°μ§μ§ μμ
// νμ΄ν ν¨μ
const arrowFunc = () => {};
console.log(arrowFunc.prototype); // undefined
// ES6 μΆμ½ν
const obj = {
foo() {}
}
console.log(obj.foo.hasOwnProperty('prototype') // false
νμ§λ§... __proto__λ κ°μ§... (= non-constructor ν¨μλ prototype νλ‘νΌν°λ κ°μ§μ§ μμ§λ§ __proto__λ κ°μ§)
__proto__μ prototype νλ‘νΌν°λ μλ‘ λμΌν νλ‘ν νμ μ κ°λ¦¬ν€μ§λ§ νλ‘νΌν°λ₯Ό μ¬μ©νλ μ£Όμ²΄κ° λ€λ₯΄λ€!
// νμ΄ν ν¨μ
const arrowFunc = () => {};
console.log(arrowFunc.prototype); // undefined
console.log(arrowFunc.__proto__ === Function.prototype); // true
// ES6 λ©μλ μΆμ½ νν
const obj = {
method() {} // λ©μλ μΆμ½ νν
};
console.log(obj.method.prototype); // undefined
console.log(obj.method.__proto__ === Function.prototype); // true
// μΌλ° ν¨μμ λΉκ΅
function normalFunc() {}
console.log(normalFunc.prototype); // {constructor: ƒ}
console.log(normalFunc.__proto__ === Function.prototype); // true
π¨ constructor
// μμ±μ ν¨μ
function Person(name) {
this.name = name
}
const me = new Person('Meme')
console.log(me.constructor === Person) // true
λͺ¨λ νλ‘ν νμ μ μμ μ μ°Έμ‘°νκ³ μλ μμ±μ ν¨μλ₯Ό κ°λ¦¬ν€λ constructor νλ‘νΌν°λ₯Ό κ°μ§λ€.
μ΄ μ°κ²°μ μμ±μ ν¨μκ° μμ±λ λ(= ν¨μ κ°μ²΄κ° μμ±λ λ) μ΄λ€μ§λ€.
κ°μ²΄λ₯Ό μμ±νλ λ°©λ² μ€, μμ±μ ν¨μκ° μλ 리ν°λ΄ νκΈ°λ²μ μν΄ μμ±λ κ°μ²΄λ νλ‘ν νμ μ΄ μ‘΄μ¬ν κΉ?
// μ΄λ°μ λ€
const obj = {}
const add = function(a, b) {return a + b}
const arr = [1, 2, 3]
const regexp = /is/ig
→ β, νμ§λ§ μ΄λ constructor νλ‘νΌν°κ° κ°λ¦¬ν€λ μμ±μ ν¨μκ° λ°λμ κ°μ²΄λ₯Ό μμ±ν μμ±μ ν¨μλΌκ³ ν μλ μλ€.
// Object μμ±μ ν¨μκ° μλλΌ, κ°μ²΄ 리ν°λ΄λ‘ λ§λ€μμ§λ§
const obj = {}
console.log(obj.constructor === Object) // true, Objectν¨μλΌκ³ λμ΄
// ν¨μλ Function μμ±μ ν¨μκ° μλλΌ, ν¨μ μ μΈλ¬ΈμΌλ‘ λ§λ€μμ
const foo() {}
console.log(foo.constructor === Function) // true
νλ‘ν νμ μ μμ±μ ν¨μμ κ°μ΄ μμ±λκ³ , prototype, constructor νλ‘νΌν°μ μν΄ μ°κ²°λμ΄ μκΈ° λλ¬Έμ
μ¦, νλ‘ν νμ κ³Ό μμ±μ ν¨μλ λ¨λ μΌλ‘ μ‘΄μ¬ν μ μκ³ λ μμΌλ‘ μ‘΄μ¬νλ€.
function Person(name) {
this.name = name;
}
const person1 = new Person('Kim');
// μν κ΄κ³ νμΈ
console.log(Person.prototype.constructor === Person); // true
console.log(person1.__proto__ === Person.prototype); // true
console.log(person1.constructor === Person); // true

- JavaScript μμ§μ ν¨μλ₯Ό μμ±ν λ prototype κ°μ²΄λ κ°μ΄ μμ±
- μ΄ prototype κ°μ²΄λ μλμΌλ‘ constructor νλ‘νΌν°λ₯Ό κ°μ§
- constructorλ λ€μ μλμ ν¨μλ₯Ό κ°λ¦¬ν΄
- κ°μ²΄κ° μμ±λ λ μλμΌλ‘ prototypeμ __proto__λ‘ λ§ν¬
μ¦,
- 리ν°λ΄λ‘ μμ±νλ , μμ±μ ν¨μλ‘ μμ±νλ
- λͺ¨λ κ°μ²΄λ λ°λμ μ΄λ€ μμ±μ ν¨μμ prototypeκ³Ό μ°κ²°λ¨
- μ΄ μ°κ²°μ __proto__μ constructor νλ‘νΌν°λ₯Ό ν΅ν΄ μ μ§λ¨
κ·ΈλΌ νλ‘ν νμ μ μΈμ μμ±μ΄ λλ κ±ΈκΉ?
=> μκΉ νλ‘ν νμ κ³Ό μμ±μ ν¨μλ μμΌλ‘ μ‘΄μ¬ν΄μΌ νλ€ νμΌλ―λ‘, μμ±μ ν¨μκ° μμ±λλ μμ μ νλ‘ν νμ λ μμ±λλ€.
- μ¬μ©μ μ μ μμ±μ ν¨μ: μμ±μ ν¨μλ‘μ νΈμΆν μ μλ ν¨μ(constructor) κ°μ²΄κ° μμ±λλ μμ μ νλ‘ν νμ λ μμ±λ¨
// ν¨μ μ μκ° νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ μμ μ νλ‘ν νμ
λ μμ±
console.log(Person.prototype) // {constructor: f}
// μμ±μ ν¨μ
function Person(name) {
this.name = name
}
- λΉνΈμΈ μμ±μ ν¨μ(Object, String, Number, Function, Array, RegExp, Date, Promise): λΉνΈμΈ μμ±μ ν¨μκ° μμ±λλ μμ μ μμ±λ¨ = μ μ κ°μ²΄κ° μμ±λλ μμ μ μμ±
// μ μ κ°μ²΄(Global Object)μ νλ‘νΌν°λ‘ μ‘΄μ¬νλ λΉνΈμΈ μμ±μ ν¨μλ€
console.log(window.Object === Object); // true (λΈλΌμ°μ νκ²½)
console.log(window.Array === Array); // true
console.log(window.Function === Function); // true
const obj = new Object()
console.log(obj.__proto__ === Object.prototype); // true
μΆμμ°μ° OrdinaryObjectCreate
= JavaScriptμμ μλ‘μ΄ κ°μ²΄λ₯Ό λ§λ€κ³ νλ‘ν νμ μ μ°κ²°νλ λ΄λΆ λ©μ»€λμ¦
- κ°μ²΄ 리ν°λ΄λ‘ κ°μ²΄λ₯Ό μμ±ν λ
- Object μμ±μ ν¨μλ‘ κ°μ²΄λ₯Ό μμ±ν λ
- μμ±μ ν¨μλ‘ μμ±ν λ
- Object.create() λ©μλλ₯Ό μ¬μ©ν λ
λ±λ±μ μν©μμ μ°μ
'FrontEnd > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JS] Setκ³Ό Map (0) | 2024.12.22 |
---|---|
[JS] μ κ·ννμ (1) | 2024.12.21 |
[Javascript] νλ‘ν νμ (1) κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°κ³Ό μμ (0) | 2024.11.09 |
[Javascript] μΌκΈ κ°μ²΄, ν¨μμ νλ‘νΌν° (0) | 2024.10.27 |
[Javascript] λ¨μΆνκ° (1) | 2024.10.26 |