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