用new和調用一個函數的區別:如果函數返回值是一個值類型(Number、String、Boolen)時,new函數將會返回這個函數的實例對象,而如果這個函數的返回值是一個引用類型(Object、Array、Funtion)時,new函數和直接調用函數的結果相同。測試代碼如下:
<script type="text/javascript">
/*//工廠模式
function Person(name,age)
{
var o = new Object();
o.name = name;
o.age = age;
o.getName = function()
{
alert(this.name);
}
return o;
}
var obj1 = new Person("liwen",25);
var obj2 = Person("liwen1",25);
obj1.getName(); //liwen*/ new一個函數的實例對象
obj2.getName(); //liwen1*/ 直接調用
這里new一個函數的對象和直接調用函數產生的結果相同,都可以彈出這個函數的name屬性。注意這里函數的返回值是一個Funtion對象
/*如果一個函數中存在return語句,調用這個函數的時候使用new和不使用new返回的結果是一樣的嗎?*/
function Test()
{
this.name = 'test';
return function()
{
return true;
}
}
//var test = new Test(); //function(){return true;} 它是Object
//var test = Test(); //function(){return true;} 它是Function
//alert(new Test() == Test()); //false 這就奇怪了,兩都明明是一樣的,都是函數,怎么不相同的,因為js對於Object和Funtion的比較是基於引用的。
//為了進一步分辨上述情形下兩者間的區別,再繼續看以下代碼
function Test()
{
this.name = "test";
return "test";
}
var test1 = new Test(); //Object 對象,它有一個name 屬性,並且返回一個字符串test
var test2 = Test(); //test ,它單純是一個字符串
/*通過上面的代碼,可以得出一個猜測:如果函數返回值為常規意義上的數值類型(Number、String、Boolean)時,new函數將會返回一個該函數的實例對象,而如果函數返回一個引用類型(Object、Array、Function)時,則new函數與直接調用函數產生的結果相同*/
</script>