整合營銷服務(wù)商

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

          免費咨詢熱線:

          深入 JavaScript 中的 class

          深入 JavaScript 中的 class

          avascript ES5 定義類(class)的三種方法

          一、構(gòu)造函數(shù)法

          function Dog() {
              this.name='大黃';
              this.call=function call() {
                  console.log('汪汪');
              }
          }
          Dog.age=10;
          Dog.prototype.eat=function () {
              console.log('吃狗糧');
          }
          var dog1=new Dog();
          dog1.call()
          dog1.eat()

          二、Object.create()

          const dog={
              name: '大黃',
              call:function(){
                  console.log('汪汪');
              }
          }
          const dog1=Object.create(dog);
          dog1.call();

          三、極簡主義法

          var Dog={
              create:function(){
                  var dog={};
                  dog.name='大黃';
                  dog.call=function(){
                      console.log('汪汪');
                  }
                  return dog;
              }
          }
          var dog1=Dog.create();
          dog1.call();

          ES6 定義類

          使用 class 關(guān)鍵字來聲明類。

          class Person {
              constructor(name,age){
                  this.name=name;
                  this.age=age
              }
          }
          let user=new Person('張三',22);
          console.log(user);

          constructor 構(gòu)造函數(shù)用于創(chuàng)建和初始化一個類

          class Person {
              // 私有變量
              #_life='';
          
              // 構(gòu)造函數(shù)
              constructor(name, age, sex, life) {
                  this.name=name;
                  this.age=age;
                  // 約定命名 通過在變量名稱前加一個下劃線來定義私有變量,實際上外部可以直接訪問
                  this._sex=sex;
                  // #作為前綴 定義私有作用域,外部無法直接訪問
                  this.#_life=life;
              }
          
              // Getter
              get getName() {
                  return this.name
              }
          
              // Setter
              set setName(name) {
                  this.name=name;
              }
          
              get sex() {
                  return this._sex;
              }
          
              get life() {
                  return `${this.#_life}年`
              }
          
              // 方法
              sayHi() {
                  console.log(`hello,我是${this.name}`);
              }
          
              // 靜態(tài)方法 該方法不會被實例繼承,而是直接通過類來調(diào)用
              static eat(food) {
                  console.log(`吃了${food}`);
              }
          
              // 私有方法
              _a() {
                  console.log('約定命名的私有方法');
              }
          
              #_sleep() {
                  console.log(`${this.name}睡著了`);
              }
          
              sleep(){
                  this.#_sleep()
              }
          }
          
          function a() {
              console.log(`${this.name}睡著了`);
          }
          
          let user=new Person('張三', 22, '男', 99);
          console.log(user);
          console.log(user.getName);
          user.name='王五'
          console.log(user.name);
          user.sayHi()
          Person.eat('蘋果')
          user._a()
          // user.#__sleep() // 無法調(diào)用
          user.sleep()
          console.log(user.sex);
          console.log(user.life);

          繼承

          /**
          
           * @author zswxjjh
          
           * @date  2021/3/29
          
           */
          'use  strict';
          
          /*
          * 模仿DOMTokenList對象,提供contains()
          * add(),remove()。toggle()方法
          * 重寫toString方法,為了模擬類數(shù)組特性
          * 提供toArray方法
          *
          * */
          var  classList=(function () {
            /*
            * e是一個元素,定義一個CSSClassList類模擬
            * DOMTokenList類
            * */
            function classList(e) {
             /* if(e.classList)
                return e.classList;
              else*/
                return new CSSClassList(e);
            }
          
            /*
            * 定義CSSClassList類
            * */
            function CSSClassList(e) {
               this.e=e;
            }
          
            /*
            * c是一個合法的類名,判斷是否包含給定的類名
            * 返回boolean
            * */
            CSSClassList.prototype.contains=function (c) {
                //是否合法
              if(!c)
              {
                throw new TypeError('參數(shù)不存在!');
              }
              else  if(c.length===0 || c.lastIndexOf(' ')!==-1/*c包含空格*/)
              {
                throw new TypeError('不合法的類名:"'+c+'"!');
              }
              if(!this.e.className)
                return false;
             if(this.e.className===c)
               return true;
             return this.e.className.search('\\b'+c+'\\b')!==-1;
            };
          
            /*
            * 追加一個類名在尾部
            *
            * */
            CSSClassList.prototype.add=function (c) {
                if(this.contains(c))
                  return;
                //判斷值里面是否以空格結(jié)尾
                var classes=this.e.className;
                 if(!classes)
                   this.e.className='';
                 if(classes.length!==0 && classes[classes.length-1]!==' ')/*不是以空格結(jié)尾*/
                 {
                    c=' '+c;
                 }
                 this.e.className+=c;
            };
            /*
            * 移除類名字c
            * */
            CSSClassList.prototype.remove=function (c) {
               if(this.contains(c))
               {
                 var pattern=new RegExp('\\b'+c+'\\b\\s*','g');
                 this.e.className=this.e.className.replace(pattern,'');
                 if(!this.e.className)
                 {
                   this.e.removeAttribute('class');
                 }
               }
            };
          
            /*
            * 如果c存在,刪除c,返回false
            * 否則,追加c,返回true
            * */
            CSSClassList.prototype.toggle=function (c) {
               if(this.contains(c))
               {
                 this.remove(c);
                 return false;
               }
               else
               {
                 this.add(c);
                 return true;
               }
            };
          
            /*
            * 覆蓋toString方法
            * */
            CSSClassList.prototype.toString=function () {
                return this.e.className;
            };
          
            /*
            * 提供類數(shù)組的功能,轉(zhuǎn)換成數(shù)組
            * */
            CSSClassList.prototype.toArray=function () {
                return this.e.className.match(/\b\w+\b/g) ||[];
            };
          
            return classList;
          })();
          /*以上代碼提供對HTML5標(biāo)簽屬性class的跨瀏覽器操作*/

          a0這是css的最簡單命名,在css的樣式中我總是糾結(jié)如何去命名,時間就浪費在這里面了,干脆就不命名算了,所有css的class都用.a(數(shù)字)命名。

          這樣弄的話,我期待的是,我對每一個標(biāo)簽寫一個樣式,樣式完成后自動去命名,匹配之前相似的樣式完成命名。當(dāng)然,修改的時候執(zhí)行同樣的操作,如果樣式有對應(yīng)類名則替換,沒有則添加。

          在標(biāo)簽中,徹底拋棄style屬性,在標(biāo)簽的class屬性中永遠(yuǎn)只有一個類名。整個web項目必須只有一個.css文件。

          而這些,需要一個工具,更人性化的工具。


          主站蜘蛛池模板: 国产一区二区三区不卡AV| 男人免费视频一区二区在线观看| 狠狠色婷婷久久一区二区三区| 精品无码国产AV一区二区三区 | 亚洲男女一区二区三区| 国产成人综合亚洲一区| 国产一区二区三区在线免费观看 | 人妻少妇精品一区二区三区| 亚洲熟女综合色一区二区三区 | 国产免费av一区二区三区| 无码8090精品久久一区| 精品国产日韩亚洲一区在线| 日韩人妻无码一区二区三区99| 日本在线一区二区| 精品一区二区高清在线观看| 波多野结衣在线观看一区二区三区| 日本在线电影一区二区三区| 国产婷婷色一区二区三区深爱网| 欧美亚洲精品一区二区| 国产伦精品一区二区三区精品| 日韩毛片一区视频免费| 一区二区三区高清视频在线观看| 欧洲精品一区二区三区| 亚洲Aⅴ无码一区二区二三区软件| 波多野结衣一区二区三区高清av| 色一情一乱一伦一区二区三区| 精品少妇一区二区三区在线| 亚洲色大成网站www永久一区| 亚洲一区在线视频观看| 国产激情无码一区二区三区 | 精品无码成人片一区二区98| 波多野结衣一区二区三区高清av| 国产午夜精品一区二区三区嫩草 | 日本精品无码一区二区三区久久久| 一区二区三区内射美女毛片| 中文字幕日韩一区| 亚洲国产一区国产亚洲 | 亚洲不卡av不卡一区二区| 国产肥熟女视频一区二区三区| 丰满爆乳一区二区三区| 成人免费视频一区二区|