ν¨μλ₯Ό κ°μ²΄μ λμΌνκ² μ¬μ©ν μ μλ€λ μλ―Έμ΄λ©° λ°νμμ ν¨μ κ°μ²΄λ‘ νκ°λλ€.
βοΈ μ‘°κ±΄
- ν¨μ κ°μ²΄λ μΌλ°κ°μ²΄μλ μλ ν¨μ κ³ μ μ νλ‘νΌν°λ₯Ό μμ νλ€.
Object.getOwnPropertyDescriptors()
λ©μλλ‘ ν¨μμ λͺ¨λ νλ‘νΌν°μνλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ
λ₯Ό νμΈν μ μλ€.- μμ λ°μ __proto__λ
Object.getOwnPropertyDescriptors()
λ©μλλ‘ νμΈνλ©΄ undefinedκ° λ°νλλ€.!!
function square(num) {
return num * num;
}
console.log(Object.getOwnPropertyDescriptors(square));
- arguments νλ‘νΌν°μ κ°μ
arguments κ°μ²΄
λ€.- ν¨μ νΈμΆ μ μ λ¬λ μΈμλ€μ μ 보λ₯Ό λ΄κ³ μλ μν κ°λ₯ν
μ μ¬ λ°°μ΄ κ°μ²΄
μ΄λ€.- ν¨μ λ΄λΆμμ μ§μ λ³μμ²λΌ μ¬μ©λλ€.
- μ΄κ³Όλ μΈμλ μ묡μ μΌλ‘ argumentsκ°μ²΄μ νλ‘νΌν°λ‘ 보κ΄λλ€.
- argumentsκ°μ²΄λ 맀κ°λ³μμ κ°μλ₯Ό νμ ν μ μλ κ°λ³ μΈμ ν¨μλ₯Ό μνν λ μ μ©νλ€.
πΎ#01
function sum() {
const array = Array.prototype.slice.call(arguments);
return array.reduce(function (pre, cur) {
return pre + cur;
}, 0);
}
console.log(sum(1, 3)); // 4
πΎ#02 - RestνλΌλ―Έν° μ¬μ©
function sum(...args) {
return args.reduce((pre, cur) => pre + cur, 0);
}
console.log(sum(1, 3, 4)); // 8
- arguments κ°μ²΄μ lenthνλ‘νΌν°λ μΈμμ κ°μλ₯Ό κ°λ¦¬ν€κ³ , ν¨μ κ°μ²΄μ lengthνλ‘νΌν°λ 맀κ°λ³μμ κ°μλ₯Ό κ°λ¦¬ν¨λ€!!!
function bar(x) {
console.log(bar.length); // 1
console.log(arguments.length); // 3
return x;
}
bar(1, 2, 3);
- ν¨μ μ΄λ¦μ λνλΈλ€.
const namedFn = function foo() {};
console.log(namedFn.name); // foo
const anonymousFn = function () {};
console.log(anonymousFn.name); // anonymousFn
function bar() {}
console.log(bar.name); // bar
π₯ ν¨μλ₯Ό μΌλ° ν¨μλ‘μ νΈμΆνλ©΄ ν¨μ κ°μ²΄μ λ΄λΆ λ©μλ[[Call]]μ΄ νΈμΆλλ€. π₯ new μ°μ°μλ‘ νΈμΆν μμ±μ ν¨μλ λ΄λΆ λ©μλμΈ[[Construct]]λ₯Ό νΈμΆνλ€. π₯ [[Construct]]λ₯Ό κ°μ§κ³ μλ ν¨μ κ°μ²΄λ₯Ό constructorλ‘, [[Construct]]λ₯Ό κ°μ§κ³ μλ μλ ν¨μ κ°μ²΄λ₯Ό non-constructorλ‘ κ΅¬λΆνλ€. π₯ μΌλ°ν¨μ(function(){}), ν¨μ μ μΈλ¬Έ, ν¨μ ννμμΌλ‘ μ μλ ν¨μλ§μ΄ `constructor`μ΄κ³ νμ΄ν ν¨μμ λ©μλ μΆμ½ννμΌλ‘ μ μλ ν¨μλ `non-constructor`μ΄λ€.
- prototype νλ‘νΌν°μ μμ±μ ν¨μλ‘ νΈμΆν μ μλ ν¨μ κ°μ²΄. μ¦ constructorλ§μ΄ μμ ν μ μλ νλ‘νΌν°μ΄λ€.
- μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
// ν¨μ κ°μ²΄λ prototype νλ‘νΌν°λ₯Ό μμ νλ€.
(function () {}.hasOwnProperty("prototype")); // true
// μΌλ° κ°μ²΄λ prototype νλ‘νΌν°κ° μλ€.
({}.hasOwnProperty("prototype")); // false
ππ» hasOwnProperty()
λ©μλλ μΈμλ‘ μ λ¬λ°μ νλ‘νΌν° ν€κ° κ°μ²΄ κ³ μ μ νλ‘νΌν° ν€μΈ κ²½μ°μλ§ trueλ₯Ό λ°ννκ³ μμλ°μ νλ‘ν νμ
μ νλ‘νΌν°μΈ κ²½μ° falseλ₯Ό λ°ννλ€.
- __proto__λ Object.prototype κ°μ²΄μ μ κ·Όμ νλ‘νΌν°μ΄λ€.(getter/setter ν¨μ)
- [[prototype]] λ΄λΆ μ¬λ‘―μ μ§μ μ κ·Όν μ μμΌλ©°, __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ νλ‘ν νμ κ°μ²΄μ μ κ·Όν μ μλ€.
ππ» __proto__λ square ν¨μμ νλ‘νΌν°κ° μλ, Object.prototype κ°μ²΄μ νλ‘νΌν°λ₯Ό μμλ°μ νλ‘νΌν°μ΄λ€.
ππ» Object.prototype κ°μ²΄μ __proto__ μ κ·Όμ νλ‘νΌν°λ λͺ¨λ κ°μ²΄κ° μ¬μ©ν μ μλ€.
ππ» [[prototype]] λ΄λΆ μ¬λ‘―μ μ§μ μ κ·Όν μ μμΌλ―λ‘
Object.prototype κ°μ²΄μ __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό μ¬μ©νμ¬ μ κ·Όν΄μΌ νλ€. ππ» newν€μλλ‘ νΈμΆν μμ±μ ν¨μλ§μ΄ [[prototype]] λ΄λΆ μ¬λ‘―μ κ°λλ€. ππ» __proto__ μ κ·Όμ νλ‘νΌν°λ Object.prototype κ°μ²΄μ νλ‘νΌν°λ€. ππ» λͺ¨λ κ°μ²΄λ Object.prototype κ°μ²΄λ₯Ό μμλ°μ __proto__ μ κ·Όμ νλ‘νΌν°λ₯Ό μ¬μ©ν μ μμ§λ§,
μΌλ° κ°μ²΄λ [[prototype]] λ΄λΆ μ¬λ‘―μ κ°μ§κ³ μμ§ μμ __proto__ μ κ·Όμ νλ‘νΌν°κ° νμ μλ€!
νμ§λ§ [[prototype]] λ΄λΆ μ¬λ‘―μ κ°μ§κ³ μλ μμ±μ ν¨μ(ν¨μ κ°μ²΄)λ __proto__λ₯Ό μ¬μ©νμ¬
[[prototype]] λ΄λΆ μ¬λ‘―μ κ°μ μ κ·Όνλ€.
μ°Έκ³ λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive