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