我希望這個問題有道理。我能永遠這樣做以下:您用建構函數創建的對象本身可以是一個函數嗎?
function constructor_function() {...code...};
var a = new constructor_function();
a();
我希望這個問題有道理。我能永遠這樣做以下:您用建構函數創建的對象本身可以是一個函數嗎?
function constructor_function() {...code...};
var a = new constructor_function();
a();
如果構造函數返回一個對象,這將是new ..
表達式的值。函數是一個對象,所以你你想要什麼:
function ConstructorFunction() {
return function() { alert("A function!"); };
}
var a = new ConstructorFunction();
a();
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這是你想要構造函數返回的函數。這必須是每次調用時都會返回一個新函數的因素。
將兩者包裝在一起得到一個函數,該函數返回一個既有返回函數又有狀態操縱的對象。
您可以從構造函數返回一個函數,但它不是一個真正的構造函數。你可以只使用功能作爲常規功能,不需要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);
這只是返回功能,並不會對新狀態做任何事情。調用'new'沒有意義。這是不必要的低效率。 – Raynos 2011-02-28 18:44:01
嗯,謝謝!你知道爲什麼警告下面的一面觸發了「[object Object]」而不是「A String!」? code = function test(){return「A string!」}; var a = new test();警報(A); – zjmiller 2011-02-28 18:46:00
@zjmiller,因爲你需要用'new'關鍵字返回一個對象。如果你不返回一個對象,那麼返回值就是在'test'函數中創建和使用的對象'this'。爲了覆蓋'this'的默認返回值,你需要返回一個對象(一個函數是一個對象,一個字符串是一個字符串) – Raynos 2011-02-28 18:51:38