Chapter 04 - norux/javascript_study GitHub Wiki
-
4. ν¨μμ νλ‘ν νμ
체μ΄λ
- 4.1 ν¨μ μ μ
- 4.2 ν¨μ κ°μ²΄: ν¨μλ κ°μ²΄λ€
- 4.3 ν¨μμ λ€μν νν
- 4.4 ν¨μ νΈμΆκ³Ό this
-
4.5 νλ‘ν νμ
체μ΄λ
- 4.5.1 νλ‘ν νμ μ λ κ°μ§ μλ―Έ
- 4.5.2 κ°μ²΄ 리ν°λ΄ λ°©μμΌλ‘ μμ±λ κ°μ²΄μ νλ‘ν νμ 체μ΄λ
- 4.5.3 μμ±μ ν¨μλ‘ μμ±λ κ°μ²΄μ νλ‘ν νμ 체μ΄λ
- 4.5.4 νλ‘ν νμ 체μ΄λμ μ’ μ
- 4.5.5 κΈ°λ³Έ λ°μ΄ν° νμ νμ₯
- 4.5.6 νλ‘ν νμ λ μλ°μ€ν¬λ¦½νΈ κ°μ²΄λ€
- 4.5.7 νλ‘ν νμ λ©μλμ this λ°μΈλ©
- 4.5.8 λν΄νΈ νλ‘ν νμ μ λ€λ₯Έ κ°μ²΄λ‘ λ³κ²½μ΄ κ°λ₯νλ€.
- 4.5.9 κ°μ²΄μ νλ‘νΌν° μ½κΈ°λ λ©μλλ₯Ό μ€νν λλ§ νλ‘ν νμ 체μ΄λμ΄ λμνλ€.
μ΄ μ₯μμλ ν¨μμ κ΄λ ¨λ λ€μμ κ°λ μ λν΄ μμλ³Έλ€.
- ν¨μ μμ±
- ν¨μ κ°μ²΄
- λ€μν ν¨μ νν
- ν¨μ νΈμΆκ³Ό this
- νλ‘ν νμ κ³Ό νλ‘ν νμ 체μ΄λ
ν¨μλ₯Ό μμ±νλ 3κ°μ§ λ°©λ²
- ν¨μ μ μΈλ¬Έ (Function Statement)
- ν¨μ ννμ (Function Expression)
- Function() μμ±μ ν¨μ
ν¨μ μμ μΌλ° κ°μ²΄μ²λΌ κ°μΌλ‘ μ·¨κΈλλ―λ‘, κ°μ²΄ 리ν°λ΄λ‘ κ°μ²΄λ₯Ό μμ±νλ κ²μ²λΌ ν¨μ 리ν°λ΄λ‘ ν¨μλ₯Ό μμ±ν μ μλ€. ν¨μ μ μΈλ¬Έμ΄λ ν¨μ ννμ λ°©λ² λͺ¨λ μ΄λ° ν¨μ 리ν°λ΄ λ°©μμΌλ‘ ν¨μλ₯Ό μμ±νλ€.
function add(x,y) {
return x + y;
}
- function ν€μλ: μλ°μ€ν¬λ¦½νΈ ν¨μ 리ν°λ΄μ function ν€μλλ‘ μμ
- ν¨μλͺ : ν¨μλͺ μ ν¨μλ₯Ό ꡬλΆνλ μλ³μλ‘ μ¬μ©λμ§λ§, ν¨μλͺ μ μ νμ¬νμ΄λ€. ν¨μλͺ μ΄ μλ ν¨μλ₯Ό μ΅λͺ ν¨μλΌ νλ€.
- λ§€κ°λ³μ 리μ€νΈ: λ§€κ°λ³μλ νμ μ κΈ°μ νμ§ μλλ€.
- ν¨μ λͺΈμ²΄: ν¨μκ° νΈμΆλμμ λ μ€νλλ μ½λ
ν¨μ μ μΈλ¬Έ λ°©μμ λ°λμ ν¨μλͺ μ΄ μ μλμ΄ μμ΄μΌ νλ€. μ΄ ν¨μ μ μΈλ¬Έ λ°©μμ C/C++μ ν¨μ μ μ λ°©λ²κ³Ό μ μ¬νλ€.
// add() ν¨μ μ μΈλ¬Έ
function add(x, y) {
return x + y;
}
console.log( add( 3, 4 ) ); // μΆλ ₯κ°: 7
μλ°μ€ν¬λ¦½νΈμμλ ν¨μλ νλμ κ°μ²λΌ μ·¨κΈλλ€. (μ΄λ¬ν νΉμ§λλ¬Έμ μλ°μ€ν¬λ¦½νΈμ ν¨μλ₯Ό μΌκΈ κ°μ²΄λΌκ³ νλ€.) λ°λΌμ ν¨μλ μ«μλ λ¬Έμμ΄μ²λΌ λ³μμ ν λΉνλ κ²μ΄ κ°λ₯νλ€.
ν¨μ 리ν°λ΄λ‘ ν¨μλ₯Ό λ§λ€κ³ , μ΄ ν¨μλ₯Ό λ³μμ ν λΉνμ¬ μμ±νλ κ²μ ν¨μ ννμμ΄λΌ νλ€.
// add() ν¨μ ννμ
var add = function (x, y) {
return x + y;
}
var plus = add;
console.log( add( 3, 4) ); // (μΆλ ₯κ°) 7
console.log( plus( 5, 6) ); // (μΆλ ₯κ°) 11
ν¨μ ννμμμλ ν¨μ μ΄λ¦μ΄ μ νμ¬νμ΄λ©°, λ³΄ν΅ μ¬μ©νμ§ μλλ€.
- addλ ν¨μ μ΄λ¦μ΄ μλ, ν¨μ λ³μμ΄λ€.
- addλ ν¨μμ μ°Έμ‘°κ°μ κ°μ§λ―λ‘ λ³μ plusμλ κ·Έ κ°μ ν λΉν μ μλ€.
μ μμ μ²λΌ μ΄λ¦μ΄ μλ ν¨μλ₯Ό μ΅λͺ ν¨μλΌ νλ€. λ°λλ‘ ν¨μ μ΄λ¦μ΄ ν¬ν¨λ ννμμ κΈ°λͺ ν¨μ ννμμ΄λΌ νλ€.
κΈ°λͺ ν¨μ ννμμ μ¬μ©ν λλ μ£Όμν΄μΌ ν μ μ΄ μλ€.
// κΈ°λͺ
ν¨μ ννμμ ν¨μ νΈμΆ λ°©λ²
var add = function sum(x, y) {
return x + y;
}
consoloe.log( add( 3, 4) ); // (μΆλ ₯κ°) 7
consoloe.log( sum( 3, 4) ); // (μΆλ ₯κ°) μλ¬ λ°μ!!!
** ν¨μ ννμμ μ¬μ©λ ν¨μ μ΄λ¦μ΄ μΈλΆ μ½λμμ μ κ·Ό λΆκ°λ₯νκΈ° λλ¬Έμ μλ¬κ° λ°μνλ€. **
κ·ΈλΌ ν¨μ μ μΈλ¬ΈμΌλ‘ μ¬μ©λ add() ν¨μλ μ΄λ»κ² ν¨μ μ΄λ¦μΌλ‘ νΈμΆμ΄ κ°λ₯νμκΉ? ν¨μ μ μΈλ¬Έμ ν¨μλ μλ°μ€ν¬λ¦½νΈ μμ§μμ μλμ κ°μ΄ ν¨μ ννμ ννλ‘ λ³κ²½λλ€.
// μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ ν¨μ ννμ ννλ‘ λ³κ²½
var add = function add(x, y) {
return x + y;
}
ν¨μ μ΄λ¦κ³Ό ν¨μ λ³μμ μ΄λ¦μ΄ addλ‘ κ°μΌλ―λ‘, ν¨μ μ΄λ¦μΌλ‘ νΈμΆλλ κ²μ²λΌ 보μ΄μ§λ§ μ€μ λ‘λ add ν¨μ λ³μλ‘ νΈμΆλ κ²μ΄λ€.
ν¨μ ννμμμ ν¨μμ΄λ¦μ μ νμ¬νμ΄μ§λ§, ν¨μ μ΄λ¦μ μ¬μ©νλ©΄ ν¨μ λ΄λΆμμ μ¬κ·νΈμΆμ΄ κ°λ₯νλ€.
// ν¨μ ννμ λ°©μμΌλ‘ ꡬνν ν©ν λ¦¬μΌ ν¨μ
var factorialVar = function factorial(n) {
if( n <= 1 ) {
return 1;
}
return n * factorial( n - 1 );
};
console.log( factorialVar( 3 ) ); // (μΆλ ₯κ°) 6
console.log( factorial( 3 ) ); // (μΆλ ₯κ°) undefined
function statementμ function expressionμμμ μΈλ―Έμ½λ‘
ν¨μ μ μΈλ¬Έ λ°©μμΌλ‘ ν¨μλ₯Ό μ μν λλ μΈλ―Έμ½λ‘ μ λΆμ΄μ§ μμμ§λ§, ν¨μ ννμ λ°©μμΌλ‘ ν¨μλ₯Ό μ μν λλ ν¨μ λμ μΈλ―Έμ½λ‘ μ λΆμλ€.
μ΄κ²μ νλμ κ΄μ΅μΌλ‘, μΌλ°μ μΌλ‘ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μμ±ν λ ν¨μ μ μΈλ¬Έ λ°©μμΌλ‘ μ μΈλ ν¨μμ κ²½μ°λ ν¨μ λμ μΈλ―Έμ½λ‘ μ λΆμ΄μ§ μμ§λ§, ν¨μ ννμ λ°©μμ κ²½μ°μλ μΈλ―Έμ½λ‘ μ λΆμ΄λ κ²μ κΆμ₯νλ€.
μ¦μ μ€ν ν¨μ κ° λ¬Έμ λ₯Ό μΌκΈ°ν μ μλ€.
var func = function() {
return 42;
} // μΈλ―Έμ½λ‘ μ¬μ©νμ§ μμ
(function()) {
console.log( "function called" );
})();
μ΄ ν¨μλ₯Ό νΈμΆνλ©΄, μλμλ λ€λ₯΄κ² 'number is not a function'μ΄λΌλ μλ¬κ° λ°μνλ€.
μλ°μ€ν¬λ¦½νΈ νμκ° func() ν¨μ μ μμμ μΈλ―Έμ½λ‘ μ μ¬μ©νμ§ μμ, return 42; λ¬Έμ₯μ μ§λ func()ν¨μ μ μ λμ μλ } λ§μΌλ‘ ν¨μκ° λλ¬λ€κ³ νλ¨νμ§ μκΈ° λλ¬Έμ΄λ€. κ·Έλ¦¬κ³ μ΄νμ λνλ μ¦μ μ€ν ν¨μλ₯Ό λ³΄κ³ func()ν¨μλ₯Ό νΈμΆν΄ λ²λ¦°λ€. λλ¬Έμ func()μ 리ν΄κ°μΈ 42λ₯Ό λ°κ³ λ§μ§λ§μ λ¨κ²¨μ§ ()λ₯Ό λ°μ 42(); μ ννκ° λλ€. νμ§λ§ 42λ μ«μμ΄λ―λ‘ μμ κ°μ μλ¬λ₯Ό λ°μμν¨λ€.
λ°λΌμ, λ§μ μλ°μ€ν¬λ¦½νΈ κ°μ΄λμμλ ν¨μ ννμ λ°©μμμμ μΈλ―Έμ½λ‘ μ¬μ©μ κ°λ ₯νκ² κΆκ³ νλ€.
μλ°μ€ν¬λ¦½νΈμ ν¨μλ **Function()**μ΄λΌλ κΈ°λ³Έ λ΄μ₯ μμ±μ ν¨μλ‘λΆν° μμ±λ κ°μ²΄λΌκ³ λ³Όμ μλ€. 리ν°λ΄λ‘ μ μΈν μλ°μ€ν¬λ¦½νΈμ ν¨μ μμ, λ΄λΆμ μΌλ‘λ Function() μμ±μ ν¨μλ‘ ν¨μκ° μμ±λλ€κ³ λ³Ό μ μλ€.
Function() μμ±μ ν¨μλ‘ ν¨μλ₯Ό μμ±νλ λ¬Έλ²
new Function( arg1, arg2, ..., argN, functionBody )
- arg1, arg2, ..., argN: ν¨μμ λ§€κ°λ³μ
- functionBody: ν¨μκ° νΈμΆλ λ μ€νλ μ½λλ₯Ό ν¬ν¨ν λ¬Έμμ΄
// Function() μμ±μ ν¨μλ₯Ό μ΄μ©ν add() ν¨μ μμ±
var add = new Function( 'x', 'y', 'return x + y' );
console.log( add( 3, 4 ) ); // (μΆλ ₯κ°) 7
μ°Έκ³ : μμ±μ ν¨μλ‘ ν¨μλ₯Ό μμ±νλ λ°©λ²μ μΌλ°μ μΌλ‘ μμ£Ό μ¬μ©λλ κΈ°λ²μ μλλ€.
μΈ κ°μ§ λ°©μμ ν¨μ μμ±λ°©λ²μλ κ°κ° λμ λ°©μμ μ½κ°μ μ°¨μ΄κ° μλ€. μλ°μ€ν¬λ¦½νΈμ GuruμΈ λκΈλ¬μ€ ν¬λ½ν¬νΈλ ν¨μ μμ±μ μμ΄, ν¨μ ννμλ§μ μ¬μ©ν κ²μ κΆνλ€. κ·Έ μ΄μ μ€ νλκ° ν¨μ νΈμ΄μ€ν λλ¬Έμ΄λ€.
// ν¨μ μ μΈλ¬Έ λ°©μκ³Ό ν¨μ νΈμ΄μ€ν
add( 2, 3 ); // 5
// ν¨μ μ μΈλ¬Έ ννλ‘ add() ν¨μ μ μ
function add(x, y) {
return x + y;
}
add( 3, 4 ); // 7
- add( 2, 3 )μ΄ νΈμΆλλ μμ μ add ν¨μλ μ μλμ§ μμ μνμ΄λ€. νμ§λ§ νΈμΆνλ κ²μ΄ κ°λ₯νλ€. ν¨μ μ μΈλ¬Έ ννλ‘ μ μν ν¨μμ μ ν¨λ²μλ μ½λμ 맨 μ²μλΆν° μμνλ€λ κ²μ ν¨μ νΈμ΄μ€ν μ΄λΌκ³ λΆλ₯Έλ€.
// ν¨μ ννμ λ°©μκ³Ό ν¨μ νΈμ΄μ€ν
add( 2, 3 ) // uncaught type error
// ν¨μ ννμ ννλ‘ add() ν¨μ μ μ
var add = function (x, y) {
return x + y;
};
add( 3, 4 ); // 7
- μ¬κΈ°μλ addκ° ν¨μ ννμ ννλ‘ μ μλμ΄ μμ΄μ ν¨μ νΈμ΄μ€ν μ΄ μΌμ΄λμ§ μλλ€.
μ΄λ¬ν ν¨μ νΈμ΄μ€ν μ ν¨μλ₯Ό μ μΈνκΈ° μ μ λ°λμ μ μΈν΄μΌ νλ€λ κ·μΉμ 무μνλ―λ‘ μ½λ ꡬ쑰λ₯Ό μμ±νκ² λ§λ€μ μλ€κ³ μ§μ λλ€. ν¨μ νΈμ΄μ€ν μ μμΈμ μλ°μ€ν¬λ¦½νΈκ° λ³μμμ±, μ΄κΈ°νμ μμ μ΄ λΆλ¦¬λμ΄ μ§νλκΈ° λλ¬ΈμΌλ‘ 5μ₯μμ λ€λ£¬λ€.
function add(x, y) {
return x+y;
}
add.result = add(3,2); //5
add.status='OK' //OK
μΌλ° κ°μ²΄μ²λΌ result μ status νλ‘νΌν°λ₯Ό μΆκ°νλκ² κ°λ₯νλ€.
- 리ν°λ΄μ μν΄ μμ±
- λ³μλ λ°°μ΄μ μμ, κ°μ²΄μ νλ‘νΌν° λ±μ ν λΉ κ°λ₯
- ν¨μμ μΈμλ‘ μ λ¬κ°λ₯
- ν¨μμ 리ν΄κ°μΌλ‘ λ¦¬ν΄ κ°λ₯
- λμ νλ‘νΌν°λ₯Ό μμ± λ° ν λΉ κ°λ₯
μΌκΈκ°μ²΄λ?
var foo = 1000;
var bar = function() = { return 100; };
var obj = {};
obj.baz = function() { return 200; };
var foo = function(func) {
func();
}
foo(function() {console.log('test');});
var foo = function() {
return function() {
console.log('test');
}
}
var bar = foo();
bar();
ν¨μλ κ°μ²΄μ΄λ€ ν¨μλ μΌλ° κ°μ²΄μ λ€λ₯΄κ² ν¨μλ§μ νμ€ νλ‘νΌν°κ° μ μλμ΄ μλ€.
Top ####4.2.3.1. length ν¨μκ° μ μμ μΌλ‘ μ€νλ λ κΈ°λλλ μΈμμ κ°μ
function func1(x){
return x;
}
function func2(x, y) {
return x + y;
}
console.log('func1.length - ' + func1.length ); // (μΆλ ₯κ°) func1.length - 1
console.log('func2.length - ' + func2.length ); // (μΆλκ°) func2.length - 2
Top ####4.2.3.2. prototype νλ‘νΌν° constructor νλ‘νΌν° νλλ§ μλ κ°μ²΄
prototype νλ‘νΌν°μ constructor νλ‘νΌν°λ μμ κ³Ό μ°κ²°λ ν¨μλ₯Ό κ°λ¦¬ν¨λ€.
μ¦, ν¨μμ prototype νλ‘νΌν°λ νλ‘ν νμ κ°μ²΄λ₯Ό κ°λ¦¬ν€κ³ , νλ‘ν νμ κ°μ²΄μ constructor νλ‘νΌν°λ ν¨μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
function func1(){
return true;
}
console.dir(func1.prototype.constructor); // (μΆλ ₯κ°) constructor : function func1()
Top ####4.2.3.3. κ·Έ μΈ κΈ°λ³Έ νλ‘νΌν°
-
name : ν¨μ μ΄λ¦
-
caller : μμ μ νΈμΆν ν¨μ
-
arguments : μΈμκ°
-
proto : λΆλͺ¨ μν μ νλ νλ‘ν νμ κ°μ²΄
ν¨μμ΄λ¦μ μ νμ¬νμ΄λ€. (λΆμ¬λλκ³ μλΆμ¬λ λ¨) μ½λ°±ν¨μλ μ΅λͺ ν¨μμ λνμ μΈ μ©λ μ€ νλμ΄λ€.
λνμ μΈ μ½λ°±ν¨μμ μ¬μ© μ
- μ΄λ²€νΈ νΈλ€λ¬ μ²λ¦¬: μΉνμ΄μ§ λ‘λ, ν€λ³΄λ μ λ ₯λ±μ DOM μ΄λ²€νΈκ° λ°μν κ²½μ° DOMμ΄λ²€νΈμ ν΄λΉνλ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μ€νμν¨λ€.
//window.onload μ΄λ²€νΈ νΈλ€λ¬ μμ μ½λ
<!DOCTYPE html>
<html><body>
<script>
// νμ΄μ§ λ‘λ μ νΈμΆλ μ½λ°± ν¨μ
window.onload = function() {
alert('this is the callback function');
};
</script>
</body></html>
- μ μμ μ½λλ, μΉνμ΄μ§κ° λ‘λ© λ λ κ²½κ³ μ°½μ΄ λ¨κ² λλ€.
ν¨μλ₯Ό μ μν¨κ³Ό λμμ λ°λ‘ μ€ννλ ν¨μλ₯Ό μ¦μ μ€ν ν¨μλΌκ³ λ§νλ€.
(function (name) {
console.log('This is the immediate function -> ' + name);
})('foo');
// κ²°κ³Ό: This is the immediate function -> foo
- μ΄λ¬ν μ¦μ μ€ν ν¨μλ, κ°μ ν¨μλ₯Ό λ€μ νΈμΆν μ μλ€.
- μ΅μ΄ νλ²μ μ€νλ§μ νμλ‘νλ μ΄κΈ°ν μ½λμ μ¬μ©λ μ μλ€.
jQueryμ κ°μ λΌμ΄λΈλ¬λ¦¬, νλ μμν¬μμλ μμ€μ½λ μ μ²΄κ° μ¦μ μ€νν¨μλ‘ κ°μΈμ Έ μλ€.
// jQueryμμ μ¬μ©λ μ¦μ μ€ν ν¨μ
(function( window, undefined ) {
...
})( window );
μ΄λ κ² μ¬μ©νλ μ΄μ λ ν¨μ μ ν¨ λ²μ νΉμ± λλ¬Έμ΄λ€.
κΈ°λ³Έμ μΌλ‘ μλ°μ€ν¬λ¦½νΈλ λ³μλ₯Ό μ μΈν κ²½μ°, μ μ μ ν¨ λ²μλ₯Ό κ°μ§κ² λλ€. ν¨μ λ΄μ μ μΈλ λ³μλ€μ ν¨μ μ ν¨ λ²μλ₯Ό κ°μ§λ€.
λ°λΌμ, λΌμ΄λΈλ¬λ¦¬κ°μ΄ λ²μ©μ μΌλ‘ μ¬μ© λ μ½λμμ μ μ μ ν¨ λ²μμ λ³μλ₯Ό μ§μ νκ² λλ©΄ λ¬Έμ κ° μμ μ μκΈ° λλ¬Έμ, μ¦μ μ€ν ν¨μλ΄μ λΌμ΄λΈλ¬λ¦¬ μ½λλ₯Ό μΆκ°νμ¬ λΌμ΄λΈλ¬λ¦¬κ° λ³μ μ΄λ¦ μΆ©λ λ¬Έμ λ₯Ό λ°©μ§ν μ μλ€.
μ λͺ λΌμ΄λΈλ¬λ¦¬μ μ¦μ μ€ν ν¨μ ν¨ν΄
// Underscroe 1.3.3 Library
(function() {
var root = this;
var previousUnderscore = root._;
....
var _ = function(obj) { return new wrapper( obj ); };
....
root['_'] = _;
...
}).call( this );
call ν¨μλ₯Ό this μΈμμ ν¨κ» μ¬μ©λμλ€. μ¦μ μ€ν λ΄λΆμ μ μ κ°μ²΄μΈ thisμ λ°μΈλ© λκ³ , ν¨μ λ΄λΆμμ rootλΌλ μ΄λ¦μΌλ‘ μ¬μ©λλ€.
// Sugar 1.2 Library (function(){ ... // Initialize buildObject(); buildString(); buildFunction() initializeClass(date); })();
> νΉλ³ν μΈμ μμ΄ μ¦μ μ€ν ν¨μλ₯Ό νΈμΆνλ€. sugarμμ μ 곡νλ λλΆλΆμ ν¨μλ Object.prototypeμ΄λ Function.prototype λ± κΈ°μ‘΄μ μλ κ°μ²΄μ λ€μ΄κ°λ―λ‘, νΉλ³ν λ€μμ€νμ΄μ€λ₯Ό μ μνμ§ μμλ€.
[Top](#_top)
<a name="ch04.3.3"/>
### 4.3.3 λ΄λΆ ν¨μ
ν¨μ μ½λ λ΄λΆμ μ μν ν¨μλ₯Ό **λ΄λΆ ν¨μ**λΌκ³ νλ€.
**λ΄λΆ ν¨μ**λ, ν΄λ‘μ λ₯Ό μμ±νκ±°λ λΆλͺ¨ ν¨μ μ½λμμ μΈλΆμ μ κ·Όμ λ§κ³ λ
립μ μΈ ν¬νΌ ν¨μλ₯Ό ꡬννλ μ©λλ‘ μ¬μ©νλ€.
```javascript
//λ΄λΆ ν¨μ μμ μ½λ
//parent() ν¨μ μ μ
function parent() {
var a = 100;
var b = 200;
// child() λ΄λΆ ν¨μ μ μ
function child() {
var b = 300;
console.log( a );
console.log( b );
}
child();
}
parent();
child();
//μΆλ ₯κ²°κ³Ό
//100
//300
//Uncaught ReferenceError: child is not defined
λ΄λΆ ν¨μμμλ μμ μ λλ¬μΌ λΆλͺ¨ ν¨μμ λ³μμ μ κ·Όμ΄ κ°λ₯νλ€.
- child λ΄λΆν¨μμ λ³μ aκ° μ μΈλμ§ μμμ§λ§, parent() ν¨μμ λ³μ aμ μ κ·Ό κ°λ₯νλ€.
- λ³μ bλ child() ν¨μμ μ μΈλμ΄ μμΌλ―λ‘, child() ν¨μμ bλ₯Ό μ°Έκ³ νλ€.
μλ°μ€ν¬λ¦½νΈμ μ€μ½ν 체μ΄λ μμΈν λ΄μ©μ 5μ₯μμ μ€λͺ νλ€. λ΄λΆ ν¨μλ μμ μ λλ¬μΌ μΈλΆν¨μμ λ³μμ μ κ·Ό κ°λ₯νλ€
λ΄λΆ ν¨μλ μΌλ°μ μΌλ‘ μμ μ΄ μ μλ λΆλͺ¨ ν¨μ λ΄λΆμμλ§ νΈμΆμ΄ κ°λ₯νλ€.
- parent() ν¨μ μΈλΆμμ child()ν¨μμ νΈμΆμ μλνμ§λ§ ν¨μκ° μ μλμ§ μμλ€λ μλ¬κ° λ°μνλ€.
ν¨μ μ€μ½ν ν¨μ μ€μ½ν λ°μμλ ν¨μ μ€μ½ν μμ μ μΈλ λͺ¨λ λ³μλ ν¨μμ μ κ·Όμ΄ λΆκ°λ₯νλ€. ν¨μ μ€μ½ν μμ μ μΈλ λ΄λΆ ν¨μλ₯Ό νΈμΆν μ μλ λ°©λ²μ΄ μλλ°, λΆλͺ¨ν¨μμμ λ΄λΆν¨μλ₯Ό μΈλΆλ‘ 리ν΄νλ€λ©΄ λΆλͺ¨ ν¨μ λ°μμλ λ΄λΆ ν¨μλ₯Ό νΈμΆνλ κ²μ΄ κ°λ₯νλ€.
//ν¨μ μ€μ½ν μΈλΆμμ λ΄λΆ ν¨μ νΈμΆνλ μμ μ½λ
function parent() {
var a = 100l
// child() λ΄λΆν¨μ
var child = function() {
console.log( a );
}
//child() ν¨μ λ°ν
return child;
}
var inner = parent();
inner();
//μΆλ ₯κ²°κ³Ό
//100
μ€νμ΄ λλ parent() ν¨μμ λ΄λΆ λ³μμΈ aλ₯Ό μ°Έμ‘°νμ¬ 100μ΄ μΆλ ₯λμλλ°, μ΄μ²λΌ μ¬μ©λλ inner()κ°μ ν¨μλ₯Ό ν΄λ‘μ λΌκ³ νλ€.
μλ°μ€ν¬λ¦½νΈμμ ν¨μλ μΌκΈ κ°μ²΄μ΄λ―λ‘, ν¨μ μ체λ₯Ό 리ν΄ν μ μλ€.
//μμ μ μ¬μ μνλ ν¨μ μμ μ½λ
//self() ν¨μ
var self = function () {
console.log('a');
return function() {
console.log('b');
}
}
self = self(); // a
self(); // b
- μ²μμ self()κ° νΈμΆλ λ, aκ° μΆλ ₯λλ€. κ·Έλ¦¬κ³ λ€μ returnμΌλ‘ μλ‘μ΄ ν¨μλ₯Ό μ μ₯νλ€.
- λλ²μ§Έλ‘, self()κ° νΈμΆλλ©΄ bκ° μΆλ ₯λλ€.
c/c++κ³Όλ λ€λ₯΄κ² μ격ν λ¬Έλ²νΈμΆμ νμ§ μμ ν¨μ νΈμΆ μμ²΄κ° μμ λ‘λ€.
c/c++κ³Όλ λ¬λ¦¬, ν¨μλ₯Ό νΈμΆν λ ν¨μ νμμ λ§μΆ° μΈμλ₯Ό λκ²¨μ£Όμ§ μλλΌλ μλ¬κ° λ°μνμ§ μλλ€.
function func(arg1, arg2) {
console.log(arg1, arg2);
}
func(); //(μΆλ ₯) undefined undefined
func(1); //(μΆλ ₯) 1 undefined
func(1,2); //(μΆλ ₯) 1 2
func(1,2,3); //(μΆλ ₯) 1 2
- ν¨μμ μΈμλ³΄λ€ μ κ² νΈμΆν κ²½μ°, undefinedκ° ν λΉλλ€.
- μΈμλ³΄λ€ λ§μ΄ νΈμΆν κ²½μ°, μ΄κ³Όλ μΈμλ 무μλλ€.
- μ΄λ κ² λκ²¨μ€ μΈμλ€μ arguments κ°μ²΄μ μ μ¬ λ°°μ΄ κ°μ²΄ ννλ‘ μ μ₯λμ΄ λ겨μ§λ€.
//arguments κ°μ²΄ μμ μ½λ
//add() ν¨μ
function add(a,b) {
//arguments κ°μ²΄ μΆλ ₯
console.dir(arguments);
return a+b;
}
console.log(add(1)); //(μΆλ ₯) NaN
console.log(add(1,2)); //(μΆλ ₯) 3
console.log(add(1,2,3)); //(μΆλ ₯) 3
console.dir(arguments) ν¬λ‘¬μμ μΆλ ₯λλ κ²°κ³Ό
λ€μλ§νμ§λ§, arguemtntsλ κ°μ²΄μ΄λ€. λ°°μ΄μ΄ μλλ€. μ μ¬ κ°μ²΄ λ°°μ΄μμ λ°°μ΄ λ©μλλ₯Ό μ¬μ©νλ λ°©λ²μ 4.4.2.4 callκ³Ό apply λ©μλλ₯Ό μ΄μ©ν λͺ μμ μΈ this λ°μΈλ©μμ μμλ³Έλ€.
//arguments κ°μ²΄μ μ¬μ© μ
function sum() {
var resule = 0;
for(var i=0; i < arguemnts.length; i++){
result += arguments[i];
}
return result;
}
console.log(sum(1,2,3)); //(μΆλ ₯) 6
console.log(sum(1,2,3,4,5,6,7,8,9)); //(μΆλ ₯) 45
μλ°μ€ν¬λ¦½νΈμμ ν¨μλ₯Ό νΈμΆνλ©΄, arguemnts κ°μ²΄μ this μΈμκ° μ묡μ μΌλ‘ μ λ¬λλ€. ν¨μκ° νΈμΆλλ λ°©μ(νΈμΆλ°©μ)μ λ°λΌμ thisκ° λ€λ₯Έ κ°μ²΄λ₯Ό μ°Έμ‘°(thisλ°μΈλ©)νκΈ° λλ¬Έμ thisλ₯Ό μ΄ν΄νλ κ²μ΄ μ΄λ ΅λ€.
λ©μλ λ΄λΆ μ½λμμ μ¬μ©λ thisλ ν΄λΉ λ©μλλ₯Ό νΈμΆν κ°μ²΄λ‘ λ°μΈλ©λλ€.
//λ©μλ νΈμΆ μ¬μ© μ this λ°μΈλ©
// myObject κ°μ²΄ μμ±
var myObject = {
name: 'foo',
sayName: function() {
console.log(this.name);
}
};
//otherObject κ°μ²΄ μμ±
var otherObject = {
name: 'bar'
}
// otherObject.sayName() λ©μλ
otherObjet.sayName = myObject.sayName;
myObject.sayName();
otherObject.sayName();
//μΆλ ₯κ²°κ³Ό
//foo
//bar
μμ μμ μμ 보λ€μνΌ thisλ μμ μ νΈμΆν κ°μ²΄μ λ°μΈλ© λλ€.
ν¨μ λ΄λΆμμ μ¬μ©λ thisλ μ μ κ°μ²΄μ λ°μΈλ©λλ€. λΈλΌμ°μ μμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ€ννλ κ²½μ°, μ μκ°μ²΄λ window κ°μ²΄κ° λλ€.
μ μ κ°μ²΄λ 무μμΈκ°?? (λΈλΌμ°μ , Node.js)
λΈλΌμ°μ νκ²½μμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ€ννλ κ²½μ°, μ μκ°μ²΄λ window κ°μ²΄κ° λλ€. Node.jsκ°μ μλ°μ€ν¬λ¦½νΈ λ°νμ νκ²½μμ μ μκ°μ²΄λ global κ°μ²΄κ° λλ€.
// μ μ κ°μ²΄μ μ μ λ³μμ κ΄κ³λ₯Ό 보μ¬μ£Όλ μμ μ½λ
var foo = "I'm foo"; // μ μλ³μ μ μΈ
console.log(foo); //(μΆλ ₯) I'm foo
console.log(window.foo); //(μΆλ ₯) I'm foo
λ°λΌμ μ μλ³μλ μ μ κ°μ²΄(window)μ νλ‘νΌν°λ‘λ μ κ·Ό κ°λ₯νλ€.
// ν¨μλ₯Ό νΈμΆν λ this λ°μΈλ©μ 보μ¬μ£Όλ μμ μ½λ
var test = 'This is test';
console.log(window.test);
//sayFoo() ν¨μ
var sayFoo = function(){
console.log(this.test); // sayFoo() ν¨μ νΈμΆ μ thisλ μ μ κ°μ²΄μ λ°μΈλ©λλ€.
}
//μΆλ ₯κ²°κ³Ό
//This is test
//This is test
- μ°μ testλΌλ μ μλ³μλ μ μκ°μ²΄ window νλ‘νΌν°λ‘ μ κ·Όμ΄ κ°λ₯νλ€.
- sayFoo()ν¨μμμ thisλ μ μκ°μ²΄ windowμ λ°μΈλ©λλ€. λ°λΌμ this.test λ window.testλ₯Ό μλ―Ένλ€.
μ΄κ°μ νΉμ±μ λ΄λΆν¨μλ₯Ό νΈμΆνμ κ²½μ°μλ λμΌνλ€. κ·Έλμ, λ΄λΆν¨μμμ thisλ₯Ό μ¬μ©ν λλ μ£Όμν΄μΌ νλ€.
// λ΄λΆν¨μμ this λ°μΈλ© λμμ 보μ¬μ£Όλ μμ μ½λ
// μ μλ³μ value μ μ
var value = 100;
//myObject κ°μ²΄ μμ±
var myObject = {
value:1,
func1: function() {
this.value += 1;
console.log("func1() called. this.value : " + this.value);
//func2 λ΄λΆν¨μ
func2 = function() {
this.value += 1;
console.log("func2() called. this.value : " + this.value);
//func3 λ΄λΆν¨μ
func3 = function() {
this.value += 1;
console.log("func3() called. this.value : " + this.value);
}
func3(); //func3() λ΄λΆ ν¨μ νΈμΆ
}
func2(); //func2() λ΄λΆ ν¨μ νΈμΆ
}
};
myObject.func1(); //func1() λ©μλ νΈμΆ
//μΆλ ₯κ²°κ³Ό
func1() called - this.value : 2
func2() called - this.value : 101
func3() called - this.value : 102
μΆλ ₯κ²°κ³Όλ₯Ό 보면, func2(), func3() μ κ²°κ³Όκ° μλμλ λ€λ₯Έ κ²μ λ³Ό μ μλ€. myObject.func1() μ νΈμΆνλ©° thisλ myObjectμ λ°μΈλ©λμμ§λ§, λ΄λΆν¨μλ€μ thisλ μ μκ°μ²΄μΈ windowμ λ§€νλμκΈ° λλ¬Έμ΄λ€. κ·Έλ¦ΌμΌλ‘ 보면 λ€μκ³Ό κ°λ€.
μ΄λ° νμμ λ€μ μ½λμ²λΌ ν΄κ²°ν μ μλ€.
//λ΄λΆ ν¨μμ this λ°μΈλ© λ¬Έμ λ₯Ό ν΄κ²°ν μμ μ½λ
var value = 100;
var myObject = {
value: 1,
func1: function() {
var that = this;
this.value += 1;
console.log("func1() called. this.value : " + this.value);
func2 = function() {
that.value += 1;
console.log("func2() called. this.value : " + that.value);
func3 = function() {
that.value += 1;
console.log("func3() called. this.value : " + that.value);
}
func3();
}
func2();
}
};
myObject.func1();
thatμ thisλ₯Ό λ΄λΆ ν¨μμμ μ¬μ©νκΈ° μν΄ μ¬μ©νλ κ΄λ‘μ μΈ λ³μμ΄λ€.
μμ±μ ν¨μ: κΈ°μ‘΄ ν¨μμ new μ°μ°μλ₯Ό λΆμ¬μ νΈμΆ μλ°μ€ν¬λ¦½νΈμμλ λͺ¨λ ν¨μλ₯Ό μμ±μ ν¨μλ‘ μ¬μ©ν μ μμΌλ―λ‘, μμ±μ ν¨μλ‘ μ μνμ¬ μ¬μ©λλ ν¨μμ κ²½μ° ν¨μμ΄λ¦μ 첫 λ¬Έμλ₯Ό λλ¬Έμλ‘ μ°κΈ°λ₯Ό κΆμ₯νκ³ μλ€.
μμ±μ ν¨μκ° λμνλ λ°©μ
μμ±μν¨μκ° νΈμΆλ λ, λμνλ λ°©μμ μ½κ° λ€λ₯΄λ€. λ€μκ³Ό κ°μ μμλ‘ λμνκ² λλ€.
- λΉ κ°μ²΄ μμ± λ° this λ°μΈλ©
λΉ κ°μ²΄κ° μμ±λλ©°, thisλ‘ λ°μΈλ© λλ€. μ΄ λΉ κ°μ²΄λ μμ±μ ν¨μμ prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ κ°μ²΄λ₯Ό μμ μ νλ‘ν νμ κ°μ²΄λ‘ μ€μ νλ€.
- thisλ₯Ό ν΅ν νλ‘νΌν° μμ±
- μμ±λ κ°μ²΄ 리ν΄
리ν΄λ¬Έμ΄ λμνλ λ°©μμ κ²½μ°μ λ°λΌ λ€λ₯΄λ€. μΌλ°μ μΌλ‘ 리ν΄λ¬Έμ΄ μλ κ²½μ°, thisλ‘ λ°μΈλ© λ μλ‘ μμ±ν κ°μ²΄κ° 리ν΄λλ€. νμ§λ§ μΌλ°ν¨μλ₯Ό νΈμΆν λ, 리ν΄κ°μ΄ λͺ μλμ΄ μμ§ μμΌλ©΄ undefinedκ° λ¦¬ν΄λλ€. 4.4.3 ν¨μ 리ν΄μμ μμΈν μμλ³Έλ€.
//μμ±μ ν¨μμ λμ λ°©μ
//Person() μμ±μ ν¨μ
var Person = function( name );
// ν¨μ μ½λ μ€ν μ
this.name = name;
// ν¨μ 리ν΄
}
//foo κ°μ²΄ μμ±
var foo = new Person('foo');
console.log( foo.name ); //(μΆλ ₯) foo
κ°μ²΄ 리ν°λ΄ λ°©μκ³Ό μμ±μ ν¨μλ₯Ό ν΅ν κ°μ²΄ μμ± λ°©μμ μ°¨μ΄ κ°μ²΄ 리ν°λ΄:
- μ ν΄μ§ νμμΌλ‘ λ°μ λ§λ€ μ μμ
- νλ‘ν νμ κ°μ²΄(proto νλ‘νΌν°)λ Objectμ΄λ€.
μμ±μ ν¨μ:
- μΈμλ₯Ό λ°μ μ¬λ¬κ°μ κ°μ²΄λ₯Ό λ€λ₯Έ νμμΌλ‘ λ§λ€ μ μμ
- νλ‘ν νμ κ°μ²΄(proto νλ‘νΌν°)λ μμ±μ ν¨μμ prototype νλ‘νΌν°κ° λλ€. (μμ μμ μμ Person)
μμ±μ ν¨μλ₯Ό newλ₯Ό λΆμ΄μ§ μκ³ νΈμΆ ν κ²½μ°
μΌλ°ν¨μλ‘ νΈμΆμ΄λλ€. μΌλ°ν¨μλ, thisμ λ°μΈλ© λ°©μμ΄ λ€λ₯΄κΈ° λλ¬Έμ window μ μ κ°μ²΄μ λ°μΈλ© λλ€.
//newλ₯Ό λΆμ΄μ§ μκ³ μμ±μ ν¨μ νΈμΆμμ μ€λ₯
var qux = Person('qux', 20, man);
console.log( qux ); //(μΆλ ₯) undefined
console.log(window.name); //(μΆλ ₯) qux
console.log(window.age); //(μΆλ ₯) 20
console.log(window.gender); //(μΆλ ₯) man
κ°μ λ‘ μΈμ€ν΄μ€ μμ±νκΈ°
μμ±μ ν¨μλ₯Ό μΌλ° ν¨μλ‘ νΈμΆνλ μ€μλ₯Ό νΌνλ €κ³ μ¬μ©λλ ν¨ν΄μ΄ μλ€.
function A(arg) { if( !( this instance A ) ) return new A( arg ); this.value = arg ? arg : 0; } // λλ λ€μκ³Ό κ°μ΄ μ¬μ© νλ€. if( !( this instance arguments.callee ) ) ...
> arguments.calleeκ° λ°λ‘ ν¨μ μ΄λ¦μ λνλ΄λ―λ‘, μμ μ½λμ μλμ μ½λλ κ°μ μλ―Έμ΄λ€.
[Top](#_top)
<a name="ch04.4.2.4"/>
#### 4.4.2.4 callκ³Ό apply λ©μλλ₯Ό μ΄μ©ν λͺ
μμ μΈ this λ°μΈλ©
thisλ₯Ό νΉμ κ°μ²΄μ **λͺ
μμ μΌλ‘ λ°μΈλ©** μν€λ λ°©λ²λ μλ€.
1. apply(thisArg, argArray)
1. call(thisArg, arg1, arg2, arg3, ...)
applyμ call λ©μλλ κΈ°λ₯μ κ°μΌλ, μΈμλ₯Ό λ겨λ°λ κ²μμ μ°¨μ΄κ° μμ λΏμ΄λ€.
```javascript
// applyμ callμ λͺ
μμ this λ°μΈλ©
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
var foo = {}; // λΉκ°μ²΄
Person.apply( foo, ['foo', 30, 'man'] );
Person.call( foo, 'foo', 30, 'man' );
μμ μ½λλ thisλ₯Ό foo κ°μ²΄μ λͺ μμ μΌλ‘ λ°μΈλ©νκ² λλ€.
apply λ©μλλ₯Ό νμ©νμ¬ arguments κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ³ννμ¬ μ¬μ©νκΈ°.
function myFunction() { var args = Array.prototype.slice.apply( arguments ); // Array.prototype.slice() λ©μλλ₯Ό νΈμΆ νλ, μ΄λ thisλ arguments κ°μ²΄λ‘ λ°μΈλ©νλΌ. }
[Top](#_top)
<a name="ch04.4.3"/>
### 4.4.3 ν¨μ 리ν΄
[Top](#_top)
<a name="ch04.4.3.1"/>
#### 4.4.3.1 κ·μΉ 1) μΌλ° ν¨μλ λ©μλλ 리ν΄κ°μ μ§μ νμ§ μμ κ²½μ°, undefined κ°μ΄ 리ν΄λλ€.
[Top](#_top)
<a name="ch04.4.3.2"/>
#### 4.4.3.2 κ·μΉ 2) μμ±μ ν¨μμμ 리ν΄κ°μ μ§μ νμ§ μμ κ²½μ° μμ±λ κ°μ²΄κ° 리ν΄λλ€.
μμ±μν¨μμμλ 리ν΄κ°μ μ§μ νμ§ μμΌλ©΄, thisλ‘ λ°μΈλ©λ μλ‘ μμ±λ κ°μ²΄κ° 리ν΄λλ€. νμ§λ§ λ€μμ λͺκ°μ§ μμΈμ¬νμ΄ μλ€.
- λͺ
μμ μΌλ‘ λ€λ₯Έ κ°μ²΄λ₯Ό 리ν΄ν κ²½μ°
```javascript
function Person(name, age, gender){
this.name = name;
this.age = age;
this.gender = gender;
//λͺ
μμ μΌλ‘ λ€λ₯Έ κ°μ²΄λ₯Ό 리ν΄
return {name:'bar', age:20, gender: 'woman'};
}
var foo = new Person( 'foo', 30, 'man' );
μ΄ κ²½μ°, fooμλ bar, 20, woman κ°μ²΄κ° 리ν΄λλ€.
- μμ±μ ν¨μμ 리ν΄κ°μ΄ κ°μ²΄κ° μλ λΆλ¦°, μ«μ, λ¬Έμμ΄μ κ²½μ°
μ΄ κ²½μ°, 리ν΄κ°μ 무μνκ³ thisλ‘ λ°μΈλ© λ κ°μ²΄κ° 리ν΄λλ€.
### 4.5.1 νλ‘ν νμ μ λ κ°μ§ μλ―Έ- μλ°μ€ν¬λ¦½νΈμλ ν΄λμ€ κ°λ μ΄ μλ€. λ€λ§, μμμ κ°λ μ μ‘΄μ¬νλ€.
- μμμ κ°λ μ λΆλͺ¨ κ°μ²΄λ 'νλ‘ν νμ ' κ°μ²΄μ΄λ€.
- λΆλͺ¨μΈ νλ‘ν νμ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ μ°Έμ‘° λ§ν¬ ννμ μ¨κ²¨μ§ νλ‘νΌν°κ° μ묡μ νλ‘ν νμ λ§ν¬μ΄λ€.
- μ묡μ νλ‘ν νμ λ§ν¬λ Prototype νλ‘νΌν°μ μ μ₯λκ³ , Prototypeλ§ν¬λΌκ³ λΆλ¦°λ€.
μλ°μ€ν¬λ¦½νΈμ κ°μ²΄ μμ± κ·μΉ μλ°μ€ν¬λ¦½νΈμμ λͺ¨λ κ°μ²΄λ μμ μ μμ±ν μμ±μ ν¨μμ prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ νλ‘ν νμ κ°μ²΄λ₯Ό μμ μ λΆλͺ¨κ°μ²΄λ‘ μ€μ νλ Prototypeλ§ν¬λ‘ μ°κ²°νλ€.
// Person μμ±μ ν¨μ
function Person(name){
this.name = name;
}
// foo κ°μ²΄ μμ±
var foo = new Person('foo');
- Person() μμ±μ ν¨μλ prototype νλ‘νΌν°λ‘ μμ κ³Ό λ§ν¬λ νλ‘ν νμ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
- Person() μμ±μ ν¨μλ‘ μμ±λ foo κ°μ²΄λ Person() ν¨μμ νλ‘ν νμ κ°μ²΄λ₯Ό Prototype λ§ν¬λ‘ μ°κ²°νλ€.
λΆλͺ¨μν μ νλ νλ‘ν νμ κ°μ²΄μ νλ‘νΌν°μ μ κ·Όνλ κ²μ κ°λ₯νκ² νλ κ²μ΄ νλ‘ν νμ 체μ΄λ μ΄λ€.
κ°μ²΄ 리ν°λ΄λ‘ μμ±ν λͺ¨λ κ°μ²΄λ Object()λΌλ λ΄μ₯ μμ±μ ν¨μλ‘ μμ±λ κ²μ΄λ€. λ°λΌμ, Object()ν¨μμ prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ Object.prototype κ°μ²΄λ₯Ό μμ μ νλ‘ν νμ κ°μ²΄λ‘ μ°κ²°(prototypeλ§ν¬)νλ€.
κ°μ²΄ 리ν°λ΄λ°©μκ³Ό μ½κ° λ€λ₯Έ 체μ΄λμ΄ μ΄λ£¨μ΄μ§μ§λ§, λ€μμ κΈ°λ³Έ μμΉμ μ μ§ν€κ³ μλ€.
μλ°μ€ν¬λ¦½νΈμμ λͺ¨λ κ°μ²΄λ μμ μ μμ±ν μμ±μ ν¨μμ prototypeνλ‘νΌν°κ° κ°λ¦¬ν€λ κ°μ²΄λ₯Ό μμ μ **νλ‘ν νμ κ°μ²΄(λΆλͺ¨κ°μ²΄)**λ‘ μ·¨κΈνλ€.
Person() μμ±μ ν¨μμ prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ Person.prototype κ°μ²΄κ° μκ³ . μ΄ κ°μ²΄ λν Object.prototypeμ Prototypeλ§ν¬λ‘ κ°μ§κ³ μλ€.
Object.prototype κ°μ²΄κ° κ²°κ΅ νλ‘ν νμ 체μ΄λμ μ’ μ μ΄λ€.
- Number.prototype : μ«μλ₯Ό μ¬μ©νλ κ°μ²΄μ νλ‘ν νμ
- String.prototype : λ¬Έμμ΄μ μ¬μ©νλ κ°μ²΄μ νλ‘ν νμ
- Array.prototype : λ°°μ΄μ μ¬μ©νλ κ°μ²΄μ νλ‘ν νμ
//String κΈ°λ³Ένμ
μ λ©μλλ₯Ό μΆκ°νμ¬ μ¬μ©ν μ μλ€.
String.prototype.testMethod = function() {
console.log("This is the String.prototype.testMethod()");
};
var str = "This is test";
str.testMethod();
νλ‘ν νμ κ°μ²΄λ μλ°μ€ν¬λ¦½νΈμ κ°μ²΄μ΄λ―λ‘, μΌλ° κ°μ²΄μ²λΌ νλ‘νΌν°λ₯Ό μΆκ°/μμ νλ κ²μ΄ κ°λ₯νλ€.
function Person(name) {
this.name = name;
}
var foo = new Person('foo');
Person.prototype.sayHello = function(){
console.log("hello");
}
foo.sayHello(); // hello
νλ‘ν νμ λ©μλ λ΄λΆμμ thisλ₯Ό μ¬μ©νλ€λ©΄, μ΄λμ λ°μΈλ© λ κ²μΈκ°??
// νλ‘ν νμ
λ©μλμ this λ°μΈλ©
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
};
var foo = new Person('foo');
console.log(foo.getName()); //(μΆλ ₯) foo
// Person.prototype κ°μ²΄μ name νλ‘νΌν° λμ μΆκ°
Person.prototype.name = 'person';
console.log(Person.prototype.getName()); //(μΆλ ₯) person
κ°μ²΄μ§ν₯μ μμμ ꡬννλ λ° μ¬μ©λλ€.
function Person(name) {
this.name = name;
}
console.log(Person.prototype.constructor); //(μΆλ ₯) Person(name)
var foo = new Person('foo');
console.log(foo.country); //(μΆλ ₯) undefined
// λν΄νΈ νλ‘ν νμ
κ°μ²΄ λ³κ²½
Person.prototype = {
country: 'Korea'
};
console.log( Person.prototype.constructor ); //(μΆλ ₯) Object();
var bar = new Person('bar');
console.log( foo.country ); //(μΆλ ₯) undefined
console.log( bar.country ); //(μΆλ ₯) Korea
console.log( foo.constructor ); //(μΆλ ₯) Person(name)
console.log( bar.constructor ); //(μΆλ ₯) Object()
4.5.9 κ°μ²΄μ νλ‘νΌν° μ½κΈ°λ λ©μλλ₯Ό μ€νν λλ§ νλ‘ν νμ 체μ΄λμ΄ λμνλ€.
function Person(name){
this.name = name;
}
Person.prototype.country = 'Korea';
var foo = new Person('foo');
var bar = new Person('bar');
console.log(foo.country); //(μΆλ ₯) Korea
console.log(bar.country); //(μΆλ ₯) Korea
foo.country = 'USA';
console.log(foo.country); //(μΆλ ₯) USA
console.log(bar.country); //(μΆλ ₯) Korea