// apply() 메서드를 이용한 명시적인 this 바인딩
// 생성자 함수
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
// foo 빈 객체 생성
var foo = {};
// apply() 메서드 호출
Person.apply(foo, [‘foo’, 30, ‘man’]);
console.dir(foo);
// 출력값
age: 30
gender: man
name: foo
__proto__: Object
function myFunction() {
//1
console.dir(arguments);
// arguments.shift(); 에러발생
// arguments 객체를 배열로 변환
// Array.prototype.slice() 메서드를 호출해라. 이 때 this는 arguments 객체로 바인딩해라.
var args = Array.prototype.slice.apply(arguments);
//2
console.dir(args);
}
// 1 (출력값)
myFunction(1, 2, 3);
Arguments(3)
0: 1
1: 2
2: 3
callee: ƒ myFunction()
length: 3
Symbol(Symbol.iterator): ƒ values()
[[Prototype]]: Object
// 2 (출력값)
Array(3)
0: 1
1: 2
2: 3
length: 3
[[Prototype]]: Array(0)
// noReturnFunc()
var noReturnFunc = function() {
console.log('This function has no return statement.');
}
var result = noReturnFunc();
console.log(return);
// (출력값)
undefined
1) 생성자 함수에서 명시적으로 객체를 리턴했을 경우
: 명시적으로 지정 객체를 리턴한 경우, 새로운 객체를 생성하더라도 명시적으로 넘긴 객체를 린턴합니다.
// Person() 생성자 함수
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');
console.dir(foo);
// (출력값)
Object
age: 20
gender: "woman"
name: "bar"
[[Prototype]] Object
2) 생성자 함수에서 명시적으로 기본 타입(불린, 숫자, 문자열) 값을 리턴했을 경우
: 명시적으로 리턴한 값을 무시하고 this로 바인딩 된 객체가 리턴된다.
function Person(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
return 100;
}
var foo = newe Person('foo', 30, 'man');
console.log(foo);
// (출력값)
Person {name: "foo", age: 30, gender: "man"}