javascript
JS学习笔记-OO疑问之封装
? ? ? ? ?封裝是面向對象的基礎,今天所要學習的匿名函數與閉包就是為了實現JS的面向對象封裝。封裝實現、封裝變量,提高數據、系統安全性,封裝正是面向對象的基礎。
一、匿名函數
????????即沒有名字的函數,其創建方式為
?????????????????function(){...}
????????單獨存在的匿名函數,無法執行,可通過賦值給變量調用或通過表達式自我執行來實現執行。
????????????????? 1.賦值給變量為一般的函數使用方式
??????????????????????????var run = function(){
???????????????????????????????????return '方法執行中';
??????????????????????????};
??????????????????????????alert(run());
????????????????? 2.通過表達式自我運行
??????????????????????????(function(arguments可選)
??????????????????????????{
???????????????????????????????????alert('方法執行中');
???????????????????????????})(arguments);
二、閉包
????????在一個普通函數的內部,創建一個匿名函數,匿名函數可訪問普通函數中的變量,進而實現類似于面向對象中封裝的特性,這個匿名函數就叫做相應普通函數的閉包。閉包就是對外創建的接口,通過接口達到訪問函數內部變量的效果。
????????functionrun() {
?????????????????var?username = 'Forrest';
?????????????????return function () { //通過匿名函數返回 box()局部變量
??????????????????????????return?username;
?????????????????};
????????}
???????? //alert(username);????????????????? //錯誤username is not defined
????????alert(run()());
???????特點:閉包中使用的局部變量會駐留在內存中,避免了使用全局變量造成的命名沖突等情況的發生。值得注意的是閉包中使用thiskeyword,指向的是window對象。
?
三、封裝
? ? ? ? ?為了更好的安全性、數據保護,則須要對數據進行私有化的封裝,而JS中沒有塊級作用域的概念(即出了{}的范圍,仍能夠訪問聲明的變量),但有了前面的基礎,我們就能夠達到像其它正規面向對象語言的封裝效果。
function user(){(function(){for(i = 0; i<5; i++){alert(i);}})();alert(i); //此處無法訪問變量i}//私有作用域取代全局變量(function(){var username= 'Forrest';alert(username); })(); //匿名函數運行完成后,變量馬上銷毀//訪問私有變量function User(){var username= Forrest; //私有變量function learn(){ //私有函數return '學習中';};//對外提供接口,間接訪問內部成員this.userlearn = function(){return username + learn();};} var user = new User()alert(user.userlearn());//實現get()、set()function User(value){var user = value;this.getUser = function(){return user;}this.setUser = function(value){user = value;}}var user = new User('Forrest');alert(user.getUser());user.setUser('Li');alert(user.getUser());//靜態私有變量(function(){var user = '';User = function(value){user = value;};User.prototype.getUser = function(){return user;};User.prototype.setUser = function(value){user = value;};})();//字面量方式的私有化function NormalUser(){}var user = function(){var user = 'Forrest';function learn(){return user + '學習中...';};var nu = new NormalUser();nu.userlearn = function(){return learn();};return nu;}();alert(user.userlearn());
? ? ? ? ?
結語:
???????? JS雖不是一門正統的面向對象的語言,但用它也能達到面向對象的封裝、繼承、多態等的效果,學習起來還是須要好好理解的,特別是對于使用JS不是特別多的人來說,僅僅能等到以后的逐步應用來解決這一系列的問題,更進一步體會它在面向對象方面的應用。
轉載于:https://www.cnblogs.com/mfrbuaa/p/4001426.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的JS学习笔记-OO疑问之封装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何通过预加载器提升网页加载速度
- 下一篇: Spring 操作数据库