在JavaScript中,任何合法的函數都可以作為物件的建構函數,這既包括系統內建函數,也包括使用者自己定義的函數。一旦函數被當作建構函數執行,它內部的this屬性將引用函數本身。
通常來說,建構子沒有回傳值,它們只是初始化由this指標傳遞進來的對象,而且什麼也不回傳。如果一個函數有回傳值,被傳回的物件就成了new表達式的值。從形式上看,一個函數被當作建構函式還是普通函式執行的唯一區別,是否用new運算子。
上面的描述事實上有著更為精確的意義,這要把函數如果有回傳值的情況分為函數的回傳值是引用型別和值型別兩種情況。
如果一個函數的回傳值是引用型別(數組,物件或函數)的數據,那麼這個函式作為建構函式用new運算子執行建構時,運算的結果將會被它的回傳值取代,這時候,建構函數體內的this值遺失了,取而代之的是被傳回的物件。例如:
function test()
function test()
{
function test()
> this.a=10;
return function()
{
return 1;
();
alert(m);//返回return後面的閉包
alert(n);//返回return 後面的閉包
運行結果m的值和n的值是一樣的,都是test函數回傳的閉包,而this引用的物件和this.a=10的賦值結果全部被丟棄。
如果一個函數的回傳值是一個值型,那麼這個函式作為建構函式用new運算子執行建構時,它的回傳值將會被丟棄。 new 表達式的結果仍是this所引用的物件。 複製程式碼
程式碼如下:
function test()
function test()
this
.a=10;
return 1;
}alert m=new test();var n=test();alert(m)//回傳【Object】alert(n)//返回1.