深度理解javascript函數

來源:互聯網
上載者:User

理解javascript函數的關鍵就是拋棄主流物件導向語言中“類”的觀念。

主流的物件導向語言,例如C++,先寫好“類”的定義。當需要對象時,用new關鍵字去划出一片記憶體來,賦上初值,就有了一個對象“類”的“執行個體”)。混淆的來源是javascript語言模仿了物件導向的文法,看到Object,new之類的關鍵字,很難不讓人去聯想那些傳統的物件導向的經典概念。

我們可以優雅的模仿“類”的觀念,但是始終要提醒自己,javascript只有對象,沒有類。

 
  1. //Animal是一個對象  
  2. Animal = {  
  3.     createNew: function( bundle ) {  
  4.         var animal = {};  
  5.         var protect = bundle || {};//bundle傳遞的是指標,修改protect時外面對象會跟著變除非不傳)  
  6.         protect.sound = 'growl';  
  7.         protect.makeSound = function(){   
  8.             return protect.sound;   
  9.         }  
  10.         return animal;  
  11.     }  
  12. }  
  13.  
  14. //Cat也是一個對象  
  15. Cat = {  
  16.     createNew: function(mySound) {  
  17.         var protect = {};  
  18.         var cat = Animal.createNew( protect );//protect會被修改,然後返回空白對象{}給cat  
  19.         protect.sound = mySound;  
  20.         cat.meow = function(){ return protect.makeSound(); };//cat要調用protect中的方法  
  21.         return cat;  
  22.     }  
  23. }  
  24.    
  25. //javascript區分大小寫,通過Cat物件建構一個新的對象賦值給cat  
  26. var cat = Cat.createNew("meow!");  
  27. pt("cat.sound");//cat不能直接存取sound  
  28. pt("cat.meow()");//通過函數可以訪問sound  
  29. var bigCat = Cat.createNew("meow!meow!meow!");  
  30. pt("bigCat.sound");//bigCat也不能直接存取sound  
  31. pt("bigCat.meow()");//通過函數可以訪問sound  

調試資訊: 
cat.sound undefined
cat.meow() meow!
bigCat.sound undefined
bigCat.meow() meow!meow!meow!
[備忘] 如果希望大貓(bigCat)小貓(cat)有公用的屬性,因為Cat本身也是一個對象,所以可以在Cat中定義對象作為公用屬性,並在createNew中增加操縱此公用屬性的函數。

模仿“類”的觀念讓我聯想到了東施效顰的典故。東施模仿西施優雅的舉止肯定是不能達到西施的水準,但是東施難道就沒有自己的特長嗎?例如,做家務會不會比西施更能幹呢?javascript函數最大的好處就是可以賦值給變數,因而我們可以編寫“函數的函數”,或者,把函數當參數傳來傳去,函數也可以有自己的方法,諸如此類。還記得在學習早期結構化的程式設計語言例如Fortran和C)時,被糾正說不能傳遞函數當參數嗎?

 
  1. Function.prototype.run=function(){  
  2.     return "run~~";  
  3. }  
  4. pt("cat.meow.run()");//函數也可以有方法 

 調試資訊:
cat.meow.run() run~~

下面玩一個複製函數的小把戲:

 
  1. //有此方法今後不需要再寫prototype關鍵字  
  2. Function.prototype.method = function(name,func){  
  3.     this.prototype[name] = func;  
  4.     return this;  
  5. };  
  6. //添加cloneFunction方法  
  7. Function.method("cloneFunction",function(){  
  8.     var slice = Array.prototype.slice;  
  9.     var args = slice.apply(arguments);  
  10.     var that = this;  
  11.     return function(){  
  12.         return that.apply(null,args.concat(slice.apply(arguments)));//此處slice.apply(arguments)含義與前處不同  
  13.     }});  
  14. //定義add函數  
  15. var add = function(a,n){  
  16.         return a+n;  
  17. }  
  18.  
  19. pt("add(0,5)");//調試輸出  
  20.  
  21. var add1 = add.cloneFunction(1);//複製1  
  22. var add2 = add.cloneFunction(2);//複製2  
  23. var add3 = add.cloneFunction(3);//複製3  
  24.  
  25. pt("add1(5)");//調試輸出  
  26. pt("add2(5)");//調試輸出  
  27. pt("add3(5)");//調試輸出  

調試資訊:
add(0,5) 5
add1(5) 6
add2(5) 7
add3(5) 8

想獲得全部可執行代碼,請下載附件。

 

本文出自 “iData” 部落格,請務必保留此出處http://idata.blog.51cto.com/4581576/1101621

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.