2011-02-28 3 views

답변

3

경우, new .. 식의 값이 될 것이다 : 나는 지금까지 다음과 같은 일을 할 수 있습니다. 함수는 객체이기 때문에, 당신은 무엇을 하시겠습니까? :

function ConstructorFunction() { 
    return function() { alert("A function!"); }; 
} 

var a = new ConstructorFunction(); 

a(); 
+2

을 새로운 상태로는 아무 것도하지 않습니다. 'new'를 호출하는 것은 의미가 없습니다. 불필요한 비 효율성입니다. – Raynos

+0

흠 감사합니다! 다음 쪽 트리거가 "A String!"대신 "[object Object]"라고 경고하는 이유를 알고 있습니까? code = function test() {return "A string!"}; var a = 새 테스트(); 경보 (a); – zjmiller

+1

@zjmiller 왜냐하면'new' 키워드로 객체를 반환해야하기 때문입니다. 객체를 반환하지 않으면 반환 값은'this' 객체이며'test' 함수에서 사용됩니다. 'this'의 기본 반환 값을 덮어 쓰려면 객체를 반환해야합니다 (함수는 객체이고, 문자열은 문자열입니다) – Raynos

1
function Wrapper(constr, func) { 
    return function() { 
     var f = func(); 
     constr.apply(f, arguments); 
     return f; 
    } 
} 

function ConstructorFunction() { 
    return function() { 
     console.log("A function"); 
    } 
} 

function Constructor() { 
    this.foo = 42; 
} 

var MyFunction = Wrapper(Constructor, ConstructorFunction); 
var o = MyFunction(); 
o(); // A function 
console.log(o.foo); // 42 

가 의도 한대로 this 상태를 조작하고 가지려면 두 객체가 될 반환 된 function 추가 농구의 많은으로하지 않고 할 어렵습니다 점프.

이것은 쉽게 만들 수 있습니다. this을 개체로 조작하는 표준 생성자 함수가 있습니다. 그런 다음 생성자가 반환 할 함수 인 ConstructorFunction이 있습니다. 이것은 호출 될 때마다 새로운 함수를 반환하는 요소 여야합니다.

두 함수를 결합하면 반환 된 함수와 상태 조작이 모두있는 객체를 반환하는 함수를 얻을 수 있습니다.

Live example

0

당신은 생성자에서 함수를 반환 할 수 있습니다,하지만 정말 생성자 아니다. 당신은 그냥 일반 함수로 기능을 사용할 수 있으며, new 키워드가 필요하지 않습니다 : 함수가 객체

function constructor_function() { 
    return function() { alert(42); } 
}; 

var a = constructor_function(); 

a(); 

, 당신도 여기에 속성을 추가 할 수 있습니다 단지를 반환

function constructor_function() { 
    var t = function() { alert(42); } 
    t.size = 1337; 
    return t; 
}; 

var a = constructor_function(); 

a(); 
alert(a.size); 
관련 문제