Js new一個函數和直接調用函數的區別


不實用new,也就是普通的函數調用而已,所以若是函數本身沒有返回值,普通的函數調用沒有什么意義
如:
var person=new Person();//person是一個對象

var person = Person();//這只是一次普通的函數調用並賦值而已。

例一:

 

[javascript]  view plain  copy
 
  1. function Person(name,age){  
  2.   
  3. this.name=name;  
  4. this.age=age;  
  5. this.sayName=function(){  
  6. alert(this.name);  
  7.       };  
  8. }  
  9.   
  10. //var person=new Person("張三",20); //此處為 構造對象,構造對象的話,返回的新對象是由解析器自己生成的。  
  11. var person=Person("張三",20); //假設我在Person函數里面加了return "你好"; 這時的person就不會報undefined,而是一個字符串你好  
  12. person.sayName();//報錯 person undefined 此處為普通函數調用,又沒有給定返回值,出錯。  
  13.   
  14. //因為此時this指向window對象,  
  15. window.sayName();//此時不會報錯  
  16.   
  17. 接下來就問,為什么我賦值給person,可以用window來引用呢?  
  18. 因為如果不用new就相當於普通函數調用,而 Person()根本沒有返回值,  
  19. 所以Person根本就沒賦值給person,此時的person只是一個undefined,  
  20. 但是Person卻執行了一次,成為了window的對象,this指向了window,所以window可以直接使用Person的方法,  
  21.   
  22. Person("張三",20);  
  23. person.sayName();  

 

 

例二:
如果函數返回值為常規意義上的數值類型(Number、String、Boolean)時,new函數將會返回一個該函數的實例對象,
而如果函數返回一個引用類型(Object、Array、Function)時,則new函數與直接調用函數產生的結果相同。
如下:
[javascript]  view plain  copy
 
  1. function Test()  
  2.   {  
  3.       this.name = "test";  
  4.       return "test";  
  5.   }  
  6.   var test1 = new Test();   //Object 對象,它有一個name 屬性,並且返回一個字符串test  
  7.   var test2 = Test();    // 函數Test()屬於Function對象   這個test2,它單純是一個字符串  

工廠模式:

 

 

[javascript]  view plain  copy
 
  1. <script type="text/javascript">  
  2.     /*//工廠模式 
  3.     function Person(name,age) 
  4.     { 
  5.         var o = new Object(); 
  6.         o.name = name; 
  7.         o.age = age; 
  8.         o.getName = function() 
  9.         { 
  10.             alert(this.name); 
  11.         } 
  12.         return o; 
  13.     } 
  14.     var obj1 = new Person("liwen",25); 
  15.     var obj2 = Person("liwen1",25); 
  16.     obj1.getName();  //liwen*/        new一個函數的實例對象  
  17.     obj2.getName();  //liwen1*/      直接調用  
  18.   
  19. 這里new一個函數的對象和直接調用函數產生的結果相同,都可以彈出這個函數的name屬性。注意這里函數的返回值是一個Funtion對象  
[javascript]  view plain  copy
 
  1.   

 

過程:
構造函數不需要顯示的返回值。使用new來創建對象(調用構造函數)時,如果return的是非對象(數字、字符串、布爾類型等)會忽而略返回值;如果return的是對象,則返回該對象。
下面簡單介紹下,javascript中new對象的過程:如var myObj = newPerson(“aty”,25);
1.創建一個空的Object對象.var obj = new Object();
2.將構造函數Person中this指向剛創建的obj對象
3.將創建的obj的__proto__指向構造函數Person的prototype。這一步是建立對象和原型直接的對應關系。firefox下通過
對象的__proto__屬性能夠訪問到原型,IE下則沒有暴露出相應的屬性。
4.執行構造函數Person()中的代碼

 原文:https://blog.csdn.net/zchdjb/article/details/53038656


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 js New一個函數和直接調用的區別 Js 使用new關鍵字調用函數和直接調用函數的區別 jquery js解析函數、函數直接調用 如何用 js 實現一個 new 函數 String直接賦值和使用new的區別 能直接調用析構函數,不能直接調用構造函數 函數直接寫在html頁面的