2011-02-28 22 views

回答

3

如果構造函數返回一個對象,這將是new ..表達式的值。函數是一個對象,所以你你想要什麼:

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

var a = new ConstructorFunction(); 

a(); 
+2

這只是返回功能,並不會對新狀態做任何事情。調用'new'沒有意義。這是不必要的低效率。 – Raynos 2011-02-28 18:44:01

+0

嗯,謝謝!你知道爲什麼警告下面的一面觸發了「[object Object]」而不是「A String!」? code = function test(){return「A string!」}; var a = new test();警報(A); – zjmiller 2011-02-28 18:46:00

+1

@zjmiller,因爲你需要用'new'關鍵字返回一個對象。如果你不返回一個對象,那麼返回值就是在'test'函數中創建和使用的對象'this'。爲了覆蓋'this'的默認返回值,你需要返回一個對象(一個函數是一個對象,一個字符串是一個字符串) – Raynos 2011-02-28 18:51:38

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); 
相關問題