2014-10-19 1 views
0

나는 어떤 문제에 붙어있어는이 같은 기능을 가지고 :"새로운"단어가 기능을 개체로 변경합니까?

var sayHi = function(string){ 
    console.log(string + '' + this.name); 
}; 

그때 내가 수행해야합니다

sayHi = giveContext(sayHi,{"name":"moe"}); 

을하고 내가 할 :

function giveContext(func,obj){ 

    var fn = func; 
    fn.prototype.name = obj.name; 

    var myFn = new fn; 

    return myFn; 

} 

및 예상되는 동작은 다음과 같습니다.

sayHi('Hello') // ==> "Hello moe" 

사실, givecontext의 "new"키워드는 함수 대신 객체를 반환합니다. 와 나는 단지

undefined moe 
Uncaught TypeError: object is not a function 

내가 부족 뭔가를 받고 있어요?

+0

왜 'sayHi'를 두 번 할당하고 있습니까? –

+0

미안하지만, 내가 잘못 입력 했으므로 두 번 할당하면 안된다. – flaalf

답변

1

을, 그 결과는 개체입니다 만들어졌습니다.

기본적으로이 : 같은

var myFn = new fn; 

작품 : 그래서

var myFn = {}; // create an object 
fn.call(myFn); // call the constructor with the object as context 

(.이 과정에 가고 더 많은 것들이 있습니다,하지만 지금은 중요한 물건입니다)

, 함수 giveContext은 함수에 컨텍스트를 제공하지 않고 반환하지만 대신 해당 함수를 객체의 생성자로 호출하고 객체를 반환합니다. 함수 내부의 코드는 이미 호출됩니다 (콘솔 출력이있는 이유입니다). giveContext의 반환 값을 함수로 사용하려고하면 함수가 아니기 때문에 오류가 발생합니다.

이미 함수에 대한 컨텍스트를 설정 method bind에 내장되어 있습니다 : (.하지만, 그것은 예를 들어 인터넷 익스플로러 8에서 지원되지 않는 방법에 대한 지원 정보를 참고)

sayHi = sayHi.bind({"name":"moe"}); 

또한 함수를 호출하는 함수를 작성하여 bind 메소드를 사용하지 않고도 동일하게 수행 할 수 있습니다.

function giveContext(f, obj) { 
    return function(){ 
    return f.apply(obj, arguments); 
    }; 
} 
+0

예 하지만 그것은 까다로운 부분입니다. 기본 메서드 "bind"는이 연습에서 사용할 수 없습니다. – flaalf

+0

@flaalf : 위의 'bind'를 사용하지 않고 대안을 추가했습니다. – Guffa

+0

그것은 작동하지 않는 것, 나는 여전히 알 수없는 모에 – flaalf

0

예, JavaScript는 객체 지향이므로 new fn이라고 말하면 새 객체가 만들어집니다. 설정에서 함수에 이름 속성이 있으므로 예상 결과를 얻으려면 "Hello " + sayHi.name을 사용해야합니다.

당신은 좋은 개요를 얻을이 있지만 읽고 싶은거야 : 당신이 객체의 생성자와 같은 기능 fn를 호출합니다 new fn을 사용하는 경우 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

+0

원래 sayHi 함수는 바꿀 수 없다. 내 말은,이 연습의 목표는 sayHi 함수에 "name"변수를 삽입하는 것이다. – flaalf

관련 문제