Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 2021国产成人午夜精品,久久精品国产亚洲,国产chinese在线视频

          整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Web前端JavaScript面向?qū)ο箝]包實(shí)現(xiàn)封裝小

          Web前端JavaScript面向?qū)ο箝]包實(shí)現(xiàn)封裝小實(shí)例

          絡(luò)圖片

          閉包,是幾乎所有前端工程師必須要掌握的一個(gè)技術(shù),這里簡(jiǎn)單說(shuō)一下閉包的概念,閉包就是指在函數(shù)中調(diào)用函數(shù)以外作用域的行為。常見(jiàn)的閉包就是在函數(shù)內(nèi)部再定義一個(gè)函數(shù)時(shí),觸發(fā)內(nèi)部函數(shù),使用外部函數(shù)的行為。

          之前的對(duì)象創(chuàng)建分為原生部分和原型部分,基于閉包方式,可以把私有的基本類(lèi)型打包起來(lái),基于函數(shù)返回值方式建立引用。

          但是原型部分的定義,感覺(jué)和閉包定義本身沒(méi)有什么聯(lián)系,所有再重新定義一個(gè)閉包。嘗試把原型的定義也打包起來(lái)。

          以下案例主要是理解關(guān)于JavaScript中封裝思想,以及如何使用閉包技術(shù)來(lái)封裝對(duì)象。

          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="UTF-8">

          <title></title>

          </head>

          <body>

          <!--

          果果爸爸青少年編程

          2019-8-2

          -->

          <script type="text/javascript">

          var Product=(function(){

          var num=10;

          function _product(id,name,costPrice){

          // 公有屬性

          this.name=name;//產(chǎn)品名稱(chēng)

          // 公有方法

          this.show=function(){

          console.log("2019新品:"+this.name+",價(jià)格公道,只要:"+calculatorSalePrice());

          }

          // 私有方法

          function calculatorSalePrice(){

          return costPrice*4.5; // 一般手機(jī)利潤(rùn)是400%左右

          }

          // 私有屬性

          var _id=id;//產(chǎn)品編號(hào)

          var _costPrice=costPrice;//產(chǎn)品成本價(jià)

          // 特權(quán)方法(getter&setter)

          this.setId=function(id){

          _id=id;

          }

          this.getId=function(){

          return _id;

          }

          this.setCostPrice=function(costPrice){

          _costPrice=costPrice;

          }

          // 構(gòu)造器

          //this.setName(name);

          this.setCostPrice(costPrice);

          }

          // 類(lèi)原型公有定義

          _product.prototype={

          // 公有屬性

          isCellphone: true,

          // 公有方法

          toString : function(){

          console.log("果果爸爸青少年編程推薦,"+this.name+"好")

          }

          }

          // 返回上面所有定義

          return _product;

          })();

          var huawei=new Product("1","華為p30",1500);

          console.log("產(chǎn)品名稱(chēng):"+huawei.name)

          huawei.show()

          console.log(huawei.isCellphone);

          huawei.toString();

          </script>

          </body>

          </html>

          執(zhí)行效果如下:

          程序執(zhí)行效果

          天給大家分享幾個(gè)好的功能封裝,在你的項(xiàng)目開(kāi)發(fā)中,一定會(huì)用的到,肯定實(shí)用。這樣寫(xiě),能提高的編碼能力,編寫(xiě)出高效且可維護(hù)的JavaScript代碼。

          功能一,動(dòng)態(tài)加載JS文件

          有過(guò)一定項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn)的同學(xué)一定知道,在實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中,會(huì)經(jīng)常碰到需要?jiǎng)討B(tài)加載一些JS的時(shí)候,比如依賴(lài)的第三方SDK。那如何封裝一個(gè)可以動(dòng)態(tài)加載JS的功能函數(shù)呢?代碼如下

          此代碼兩個(gè)核心點(diǎn):

          1. 使用Promise處理異步

          2. 使用腳本標(biāo)簽加載和執(zhí)行JS

          // 封裝
          function loadJS(files, done) {
            const head=document.getElementsByTagName('head')[0];
            Promise.all(files.map(file=> {
              return new Promise(resolve=> {
                const s=document.createElement('script');
                s.type="text/javascript";
                s.async=true;
                s.src=file;
                s.addEventListener('load', (e)=> resolve(), false);
                head.appendChild(s);
              });
            })).then(done);
          }
          
          // 使用
          loadJS(["test1.js", "test2.js"], ()=> {
          
          });

          功能二,遞歸檢索對(duì)象屬性

          當(dāng)一個(gè)對(duì)象的屬性也是一個(gè)對(duì)象的時(shí)候,如何遍歷出這個(gè)對(duì)象上的所有屬性,包括子屬性對(duì)象上的對(duì)象。

          使用遞歸循環(huán)遍歷

          function getAllObjectProperties(obj) {
            for (const prop in obj) {
              if (typeof obj[prop]==="object") {
                getAllObjectProperties(obj[prop]);
              } else {
                console.log(prop, obj[prop]);
              }
            }
          }
          
          const sampleObject={
            name: "John",
            age: 30,
            address: {
              city: "Example City",
              country: "Example Country"
            }
          };
          
          getAllObjectProperties(sampleObject);

          功能三,柯里化(Currying)

          將一個(gè)采用多個(gè)參數(shù)的函數(shù)轉(zhuǎn)換為一系列函數(shù),每個(gè)函數(shù)只采用一個(gè)參數(shù),這增強(qiáng)了函數(shù)使用的靈活性,最大限度地減少了代碼冗余,并提高了代碼的可讀性。

          function curryAdd(x) {
            return function (y) {
              return function (z) {
                return x + y + z;
              };
            };
          }
          
          const result=curryAdd(1)(2)(3);

          功能四,函數(shù)僅執(zhí)行一次

          在某些情況下,特定函數(shù)只允許執(zhí)行一次。這種情況還是挺多的。

          once函數(shù)包裝了另一個(gè)函數(shù),確保它只能執(zhí)行一次

          // 封裝
          function once(fn) {
            let executed=false;
            return function (...args) {
              if (!executed) {
                executed=true;
                return fn.apply(this, args);
              }
            };
          }
          
          // 執(zhí)行
          const runOnce=once(()=> {
          
          });
          
          runOnce();
          runOnce();

          功能五,添加默認(rèn)值

          如果用戶省略參數(shù),則分配一個(gè)預(yù)定的默認(rèn)值。

          function greetUser(name="Guest") {
            console.log(`Hello, ${name}!`);
          }
          greetUser(); // 輸出: Hello, Guest!
          greetUser("John"); // 輸出:Hello, John!

          功能六,利用Reduce進(jìn)行數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換

          下面這個(gè)實(shí)例,我需要將數(shù)據(jù)按指定字段分類(lèi)出來(lái),只需要將使用reduce封裝一個(gè)可執(zhí)行的函數(shù)就行。

          在之前的一篇文章《如何打造屬于自己的Javascript武器庫(kù),來(lái)封裝這些經(jīng)典的方法吧》中,有封裝過(guò)一些簡(jiǎn)單的方法。

          今天這篇文章我們繼續(xù)看看關(guān)于字符串處理的常用方法,并將其封裝,完善自己的Javascript武器庫(kù)。

          文中的代碼我已經(jīng)放到Github上了,有需要的同學(xué)可以自取。

          https://github.com/zhouxiongking/article-pages/blob/master/articles/jsCapsulation/capsulation2.js

          Javascript

          去除空格的方法

          該方法的主要目的是通過(guò)傳遞不同的參數(shù),選擇去除哪里的空格。

          • all - 代表所有空格

          • preBehind - 前后空格

          • previous - 前面空格

          • behind - 后面空格

          主要思想是:通過(guò)正則表達(dá)式\s匹配空白字符,然后用''去替換空白字符。

          得到的代碼如下所示。

          去除空格方法

          字母大小寫(xiě)切換

          該方法的主要目的是:將字符串的首字母或者全部字母,進(jìn)行大小寫(xiě)轉(zhuǎn)換。根據(jù)傳入的參數(shù)進(jìn)行處理。

          • FirstUpper - 首字母大寫(xiě)

          • FirstLower - 首字母小寫(xiě)

          • AllToggle - 全部大小寫(xiě)相互轉(zhuǎn)換

          • AllUpper - 全部大寫(xiě)

          • AllLower - 全部小寫(xiě)

          主要思想是:根據(jù)傳入的參數(shù),配合使用字符串自身的toUpperCase和toLowerCase方法。

          得到的代碼如下所示。

          字母大小寫(xiě)轉(zhuǎn)換

          其中的ToggleCase方法用于大小寫(xiě)相互轉(zhuǎn)換,其如下所示。

          大小寫(xiě)相互轉(zhuǎn)換

          檢測(cè)字符串類(lèi)型

          該方法主要用于檢測(cè)輸入的字符串是否是我們想要的類(lèi)型,例如email代表郵箱,phone代表手機(jī)號(hào),number代表數(shù)字,chinese代表中文。

          主要思想是:獲得想要獲取類(lèi)型的正則表達(dá)式,然后返回匹配的結(jié)果。

          得到的代碼如下所示。

          檢測(cè)字符串類(lèi)型

          上述的檢測(cè)方案完全可以按照需求進(jìn)行擴(kuò)充,直接通過(guò)case,就可以自行添加。

          檢測(cè)密碼強(qiáng)度

          該方法主要用于模仿檢測(cè)設(shè)置密碼的強(qiáng)度,檢測(cè)規(guī)則如下:

          • 如果密碼長(zhǎng)度小于6,則強(qiáng)度為0。

          • 如果密碼包含數(shù)字,則強(qiáng)度加1。

          • 如果密碼包含小寫(xiě)字母,則強(qiáng)度加1。

          • 如果密碼包含大寫(xiě)字母,則強(qiáng)度加1。

          • 如果包含特殊字符,則強(qiáng)度加1。

          上述規(guī)則會(huì)累加統(tǒng)計(jì),最高強(qiáng)度為4。

          得到的代碼如下所示。

          檢測(cè)密碼強(qiáng)度

          隨機(jī)生成指定長(zhǎng)度字符串

          該方法主要用于隨機(jī)生成指定長(zhǎng)度的字符串,例如隨機(jī)驗(yàn)證碼我們完全可以通過(guò)這個(gè)方法去實(shí)現(xiàn)。

          主要思想是:先通過(guò)Math.random()方法生成隨機(jī)數(shù),然后調(diào)用toString(36)方法轉(zhuǎn)化為字符串,再截取掉前面的0和小數(shù)點(diǎn),循環(huán)計(jì)算直到達(dá)到指定長(zhǎng)度。

          該方法的核心在于toString()方法的使用,Number類(lèi)型的toString方法已經(jīng)重寫(xiě),傳入的參數(shù)表示轉(zhuǎn)化的進(jìn)制數(shù),傳入的范圍是2-36,最小的2表示0-1,最大的36數(shù)字0-9和小寫(xiě)字母a-z,如上面的toString(36),表示要用36進(jìn)制數(shù)表示。

          根據(jù)以上分析,得到的代碼如下所示。

          隨機(jī)生成指定長(zhǎng)度字符串

          統(tǒng)計(jì)給定字符串中,目標(biāo)字符串出現(xiàn)的次數(shù)

          該方法通過(guò)字符串的split方法實(shí)現(xiàn)特別簡(jiǎn)單。通過(guò)split方法按照目標(biāo)字符串分割成數(shù)組,目標(biāo)字符串出現(xiàn)的次數(shù)就是數(shù)組的長(zhǎng)度減去1。

          根據(jù)以上分析,得到的代碼如下所示。

          統(tǒng)計(jì)指定字符串出現(xiàn)次數(shù)

          格式化處理字符串

          該方法主要用于將字符串通過(guò)傳入的參數(shù)格式化處理,接收的參數(shù)如下所示。

          • size - 表示分割的位數(shù),默認(rèn)為3。

          • delimiter - 處理后字符串的連接符,默認(rèn)為','

          該方法的思想是通過(guò)正則表達(dá)式,動(dòng)態(tài)獲取每次需要捕獲的位數(shù),然后將其捕獲的位置前后替換為連接符。

          得到的代碼如下。

          格式化字符串處理

          結(jié)束語(yǔ)

          今天這篇文章主要補(bǔ)充了Javascript中與字符串有關(guān)的方法的封裝,其他需要封裝的方法還有很多,大家也可以自行總結(jié)。


          主站蜘蛛池模板: 久久久精品人妻一区二区三区| 无码人妻精品一区二区三区99性 | 日韩精品福利视频一区二区三区| 久久亚洲色一区二区三区| 国产精品无码一区二区三区毛片| 国产亚洲综合一区柠檬导航| 国产中的精品一区的| 中文字幕人妻第一区| 无码少妇一区二区性色AV| 一区二区三区人妻无码| av无码一区二区三区| 亚洲AⅤ无码一区二区三区在线 | 国产免费一区二区三区不卡| 日韩精品一区二区三区影院| 狠狠做深爱婷婷久久综合一区| 亚洲高清毛片一区二区| 亚洲AV噜噜一区二区三区| 国产一区二区三区韩国女主播| 亚洲一区二区三区播放在线| 日韩精品无码一区二区三区| 色婷婷一区二区三区四区成人网 | 中文无码一区二区不卡αv| 久久久无码一区二区三区| 无码精品人妻一区二区三区免费看| 久久无码精品一区二区三区 | 国产精品亚洲一区二区无码| 国产乱码精品一区二区三区香蕉 | 精品一区二区三区高清免费观看| 国产一区二区三区免费视频| 内射少妇一区27P| 在线日韩麻豆一区| 无码人妻久久一区二区三区蜜桃 | 国产麻豆精品一区二区三区| 国产午夜一区二区在线观看| 又紧又大又爽精品一区二区| 一区二区三区免费在线视频| 国产一区二区免费| 精品一区二区三区免费毛片爱| 久久精品国产AV一区二区三区| 亚洲欧美日韩一区二区三区在线 | 亚洲男人的天堂一区二区|