Front-End/JavaScript

[μžλ°”μŠ€λ¦½νŠΈ(JavaScript )] 11. ν•¨μˆ˜ ν”„λ‘œνΌν‹° (Function Property)

Bigone17 2022. 2. 10. 12:14

🟑 1. ν”„λ‘œνΌν‹° (Property)

 - ν”„λ‘œνΌν‹°λŠ” μ†μ„±μ΄λΌλŠ” 뜻으둜, μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 객체 λ‚΄λΆ€μ˜ 속성을 μ˜λ―Έν•©λ‹ˆλ‹€.

let person = {
    name : 'bigone',
    age : 30
}

- μœ„ μ˜ˆμ‹œλ₯Ό 보면 personμ΄λΌλŠ” 객체 μ•ˆμ— name, ageμ΄λΌλŠ” keyκ°€ μžˆλŠ”λ°, 이λ₯Ό ν”„λ‘œνΌν‹°λΌκ³  ν•©λ‹ˆλ‹€.

 

 

 

🟑 2. ν•¨μˆ˜ ν”„λ‘œνΌν‹°

 - ν•¨μˆ˜λ„ κ°μ²΄μ΄λ―€λ‘œ ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

function sum (a, b){
	return a + b;
}

console.dir(sum)

 sum ν•¨μˆ˜μ˜ ν”„λ‘œνΌν‹°

 - sum ν•¨μˆ˜ 생성 μ½”λ“œλ₯Ό 보면 argument, caller λ“±κ³Ό 같은 ν”„λ‘œνΌν‹°λ“€μ„ μƒμ„±ν•œ 적이 μ—†λŠ”λ°, μžλ™μœΌλ‘œ 생성이 λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” Function μƒμ„±μžμ— μ˜ν•΄μ„œ ν•¨μˆ˜κ°€ 생성될 λ•Œ μžλ™μœΌλ‘œ 할당이 λ©λ‹ˆλ‹€.

 - ν•¨μˆ˜μ—λŠ” 기본적으둜 arguments, caller, length, name, prototype λ“±μ˜ ν”„λ‘œνΌν‹°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

 

 

🟣 2.1 arguments ν”„λ‘œνΌν‹°

 - ν•¨μˆ˜ 호좜 μ‹œ μ „λ‹¬λ˜λŠ” μΈμˆ˜λ“€μ˜ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” λ°°μ—΄μž…λ‹ˆλ‹€. ν•¨μˆ˜ μ•ˆμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•œ μ§€μ—­λ³€μˆ˜μž…λ‹ˆλ‹€.

function minus(a, b){
	console.log(arguments);
    return a-b;
}

minus(); // Arguments [callee: ƒ, Symbol(Symbol.iterator): ƒ]
minus(1); // Arguments [1, callee: ƒ, Symbol(Symbol.iterator): ƒ]
minus(2,1); // Arguments(2) [2, 1, callee: ƒ, Symbol(Symbol.iterator): ƒ]
minus(3,2,1); // Arguments(3) [3, 2, 1, callee: ƒ, Symbol(Symbol.iterator): ƒ]

minus ν•¨μˆ˜μ— 3,2,1 인수λ₯Ό μ „λ‹¬ν–ˆμ„ λ•Œμ˜ arguments

 

 - arguments ν”„λ‘œνΌν‹°λŠ” 일뢀 λΈŒλΌμš°μ €μ—μ„œ 지원은 ν•˜κ³  μžˆμœΌλ‚˜, deprscated(μ€‘μš”λ„κ°€ λ–¨μ–΄μ Έ 더 이상 μ‚¬μš©λ˜μ§€ μ•Šκ³  μ•žμœΌλ‘œ μ‚¬λΌμ§€κ²Œ 될)λ˜μ–΄ μ‹€λ¬΄μ—μ„œλŠ” 거의 μ‚¬μš©λ˜κ³  μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 

 

 

 πŸŸ£ 2.2 caller ν”„λ‘œνΌν‹°

  - caller ν”„λ‘œνΌν‹°λŠ” μžμ‹ μ„ ν˜ΈμΆœν•œ ν•¨μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

function sum (a, b){
	console.log(sum.caller);
    
    return a+b;
}

function calculator(x, y) {
	let sum_ = sum(x, y);
    
    return sum_;
}

calculator(1, 10); // f calculator(x,y) {...}
sum(1,2); // null -> λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰ν–ˆμœΌλ―€λ‘œ callerκ°€ μ—†λ‹€.

 - calculatorλ₯Ό ν†΅ν•΄μ„œ sumν•¨μˆ˜λ₯Ό 호좜 μ‹œ sum의 callerμ—λŠ” calculatorκ°€ λ“€μ–΄κ°€ μžˆμŠ΅λ‹ˆλ‹€.

- sum ν•¨μˆ˜λ₯Ό 직접 호좜 μ‹œ callerλŠ” nullμž…λ‹ˆλ‹€. ν˜ΈμΆœν•œ ν•¨μˆ˜κ°€ μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

🟣 2.3 length ν”„λ‘œνΌν‹°

 - length ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜ μ •μ˜ μ‹œ μž‘μ„±λœ λ§€κ°œλ³€μˆ˜ 개수λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

// λ§€κ°œλ³€μˆ˜ 0개
function func1(){}
// λ§€κ°œλ³€μˆ˜ 1개
function func2(a){}
// λ§€κ°œλ³€μˆ˜ 2개
function func3(a,b){}

console.log(func1.length); // 0
console.log(func2.length); // 1
console.log(func3.length); // 2

 

 

 πŸŸ£ 2.4 name ν”„λ‘œνΌν‹°

 - ν•¨μˆ˜λͺ…을 μ˜λ―Έν•©λ‹ˆλ‹€. κΈ°λͺ… ν•¨μˆ˜(이름을 λͺ…μ‹œν•œ ν•¨μˆ˜)의 경우 ν•¨μˆ˜λͺ…을 κ°’μœΌλ‘œ κ°–κ³  읡λͺ… ν•¨μˆ˜μΈ 경우 빈 λ¬Έμžμ—΄μ„ κ°’μœΌλ‘œ κ°–κ²Œ λ©λ‹ˆλ‹€. 단, ES6μ΄ν›„λΆ€ν„°λŠ” 읡λͺ… ν•¨μˆ˜μ˜ 이름이 name의 κ°’μœΌλ‘œ ν• λ‹Ήλ©λ‹ˆλ‹€.

// κΈ°λͺ… ν•¨μˆ˜
function sum(a,b) {
	return a+b;
}

// 읡λͺ… ν•¨μˆ˜
let minus = function(a,b) {
	return a-b;
}

console.log(sum.name); // sum
console.log(minus.name); // ES6 이전 -> '' , ES6λΆ€ν„° -> minus

 

 

🟣 2.5 __proto__ μ ‘κ·Όμž ν”„λ‘œνΌν‹°

 - λͺ¨λ“  κ°μ²΄λŠ” [[Prototype]]μ΄λΌλŠ” λ‚΄λΆ€ 슬둯이 있고, ν”„λ‘œν† νƒ€μž… 객체λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž… κ°μ²΄λž€ 객체 κ°„μ˜ 상속(Inheritance)을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. (μ—¬κΈ°μ„œ 상속은 μ‰½κ²Œ 말해, λΆ€λͺ¨λ‹˜μ΄ μžμ‹μ—κ²Œ μž¬μ‚°μ„ μƒμ†ν•˜λ“―μ΄ λΆ€λͺ¨ 객체가 μžμ‹ κ°μ²΄μ—κ²Œ λΆ€λͺ¨μ˜ 속성을 μ£ΌλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.) 

- __proto__ ν”„λ‘œνΌν‹°λŠ” [[Prototype]] λ‚΄λΆ€ 슬둯이 κ°€λ¦¬ν‚€λŠ” ν”„λ‘œν† νƒ€μž… 객체에 μ ‘κ·Όν•˜λŠ” μ ‘κ·Ό ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€. λ‚΄λΆ€ μŠ¬λ‘―μ—λŠ” 직접 접근을 ν•  수 μ—†μœΌλ―€λ‘œ __proto__λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

console.log(Object.prototype) // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}

let obj = {};

console.log(obj.__proto__); // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}

console.log(Object.prototype === obj.__proto__); // true

 

- __proto__ ν”„λ‘œνΌν‹°λŠ” 객체가 직접 μ†Œμœ ν•œ 것이 μ•„λ‹ˆκ³  Object.prototype 객체의 ν”„λ‘œνΌν‹°λ₯Ό 상속받은 κ²ƒμž…λ‹ˆλ‹€.

// Object.prototype 객체에 μƒˆλ‘œμš΄ ν”„λ‘œνΌν‹° μΆ”κ°€
Object.prototype.hello = function(){
	console.log('Hi');
}

let a = {};

console.log(a.__proto__.hello); //ƒ (){console.log('Hi');}

 

 

🟣 2.6 prototype ν”„λ‘œνΌν‹°

 - prototype ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜ κ°μ²΄μ—λ§Œ μžˆλŠ” ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€. 일반 κ°μ²΄μ—λŠ” prototype ν”„λ‘œνΌν‹°κ°€ μ—†μŠ΅λ‹ˆλ‹€.

let a = {};

let b = function(){};

console.log(a.prototype); // undefined
console.log(b.prototype); // {constructor: ƒ}

 

- prototype ν”„λ‘œνΌν‹°λŠ” μƒμ„±μž ν•¨μˆ˜μ— μ˜ν•΄μ„œ ν•¨μˆ˜λ₯Ό 생성할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

function Puppy (name) {
	this.name = name;
}

Puppy.prototype = {
	귀여움 : true
}

let κΎΈκΈ° = new Puppy('κΎΈκΈ°');

console.log(κΎΈκΈ°); // Puppy {name: 'κΎΈκΈ°'}
console.log(κΎΈκΈ°.귀여움); // true

 

 

 

 

πŸ“ μ •λ¦¬ 

  • ν”„λ‘œνΌν‹°λŠ” 객체의 속성을 μ˜λ―Έν•œλ‹€.
  • ν•¨μˆ˜ ν”„λ‘œνΌν‹°μ—λŠ” 기본적으둜 arguments, caller, length, name, prototype ν”„λ‘œνΌν‹°κ°€ μžˆλ‹€.
  • arguments ν”„λ‘œνΌν‹°λŠ” ν•¨μˆ˜κ°€ 호좜될 λ•Œ μ „λ‹¬λœ 인수λ₯Ό 담은 λ°°μ—΄
  • callerλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ ν•¨μˆ˜
  • lengthλŠ” ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ˜ 개수λ₯Ό 의미
  • prototype은 ν•¨μˆ˜ κ°μ²΄μ—λ§Œ 있고, μƒμ„±μž ν•¨μˆ˜λ‘œ 객체λ₯Ό 생성할 λ•Œ μ‚¬μš©

 

 

 

 

 

κΈ΄ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ :) 
ν‹€λ¦° λ‚΄μš©μ΄ μžˆκ±°λ‚˜, 덧뢙일 λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ–Έμ œλ“ μ§€ λŒ“κΈ€ λ‹¬μ•„μ£Όμ„Έμš”!
제 글이 μ‘°κΈˆμ΄λ‚˜λ§ˆ μ½μœΌμ‹  λΆ„λ“€μ—κ²Œ 도움이 λ˜λ„λ‘ λ…Έλ ₯ν•˜κ² μŠ΅λ‹ˆλ‹€
λ‹€μŒ νŽΈμ— λ΄¬μš”~

 

728x90
λ°˜μ‘ν˜•