整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          javaScript 面向對象之構造函數、工廠方式、

          javaScript 面向對象之構造函數、工廠方式、字面量

          者:極客小俊

          一個專注于web技術的80后

          你不用拼過聰明人,你只需要拼過那些懶人 你就一定會超越大部分人!


          什么是面向對象編程?

          面向對象的英文全稱:Object Oriented Programming , 簡稱OOP

          首先我們要先了解面向過程的編程思想, 就是代碼從上到下都沒有封裝的意思,某些代碼裸露在外、沒有模塊化、代碼雜亂無章的寫法. 并且還不好維護,也不便于后期二次修改

          面向對象的編程思想: 通俗地說就是要具備代碼好維護、代碼重用性高、耦合度低、高內聚、模塊化、便于修改

          名詞解釋:

          高內聚: 指一個軟件模塊是由相關性很強的代碼組成,只負責一項任務,也就是常說的單一責任原則。

          低耦合: 指讓每個模塊盡可能地獨立完成某個特定的子功能。

          面向對象的主要特點:

          1. 抽象:抓住核心問題, 去掉相關性不強的代碼, 把類似一樣的功能性代碼放在一起、[把這個功能所需要的相同功能代碼抽取出來,然后進行封裝]
          2. 封裝:只能通過對象來訪問方法 [提高可維護性]
          3. 繼承:從已有對象上繼承出新的對象 [提高代碼重用性]
          4. 多態:讓同一個[接口] 被不同的對象所繼承或者實現,從而產生不同的處理方式

          js是一門基于對象的語言

          js是一門解釋型的語言

          js是一門腳本語言、弱類型語言!

          分析什么是對象?

          對象:具有特征和行為或者說 有屬性方法, 具體特指的某一個事物

          對象的組成

          屬性 就是變量 表示一個對象的狀態 對象下面的變量就叫做:屬性

          方法 就是函數 表示一個對象的行為過程 對象下面的函數就叫做:方法

          javascript創建對象的三種基本方式

          1.調用系統的構造函數創建對象

          創建對象也叫實例化對象, Object是系統的構造函數

           //語法
           var 變量名=new Object();

          如何添加對象的屬性和方法

          添加屬性: 如何添加屬性?

           var 變量名=new Object();
           變量名.屬性名=值;

          添加方法: 如何添加方法?

           var 變量名=new Object();
           
           變量名.方法名=function(){ 
               ..代碼段...
           } 
               
           或
           
           function 函數名(){
               
           }
           變量名.方法名=函數名;

          案例:

           var obj=new Object();
           obj.name='張三';
           obj.age=33;
           obj.city='重慶';
           obj.say=function(){
               alert('張三說話了!');
           }
           console.log(obj);

          這種創建方式的缺點是:

          1.如果使用這種方式創建了多個對象、會產生對象不能分辨出到底屬于哪一個類型!

          2.每創建 一個對象都需要new Object() 一次 耗費內存空間、 不能一次性創建多個對象

          小知識: 如何判斷某一個對象引用變量是不是屬于某一個類型?

          語法: 對象引用變量名稱 instanceof 類名稱 返回true就是屬于這個類 返回false不屬于這種類型

          this關鍵字的基本使用

          在當前的對象方法中,可以使用this關鍵字代表當前對象

          小知識: 訪問對象屬性和方法的另一種寫法: 對象[“屬性名”] 或 對象方法名

          案例代碼如下:

           var obj2=new Object();
           obj2.name='李四';
           obj2.age=66;
           obj2.city='北京';
           obj2.say=function(){
               console.log('李四說話了');
               console.log(this.name);
           }
           console.log(obj2["name"]);
           obj2["say"]();
           

          2.工廠方式與構造函數

          工廠方式也可以叫做封裝函數

          優點: 代碼復用性提升、不同的數據當做參數進行傳遞

          自定義構造函數創建對象

          了解一下如何一次性創建多個對象?

          工廠方法 方法1: 首先把創建對象的系統構造對象相關代碼封裝在一個函數中,不同的數據當做參數進行傳遞,然后返回創建好的對象

          案例代碼如下:

           function createObject(username,age){
               var obj=new Object();
               obj.name=username;
               obj.age=age;
               obj.city='重慶';
               obj.say=function(){
                   console.log(this.name+'的年齡是:'+this.age);
               }
               return obj;
           }
           
           var obj1=createObject('張三',23);
           var obj2=createObject('李四',66);
           obj1.say();
           obj2.say();

          工廠方法 方法2:自定義構造函數創建對象, 自己定義一個構造函數,創建對象

          優點: 可以區分出對象引用屬于哪一類

          案例代碼如下

           //Person就是構造函數
           function Person(username,age,city){
               this.name=username;
               this.age=age;
               this.city=city;
               this.say=function(){
                   console.log(this.name+'的年齡是:'+this.age);
               }
           }
           
           
           var obj1=new Person('張三',33,'北京市');
           var obj2=new Person('李四',66,'重慶市');
           obj1.say();
           obj2.say();

          小結: 通過上面的案例可以小結出一個概念: 就是函數如果前面有new關鍵字,那么這個函數就是構造函數,否則就是一個普通函數

          ==在javascript中使用new關鍵字來修飾一個 普通函數的解答

          系統做4件事情

          1. 首先這個函數就成為了 構造函數, 因為 new 后面跟一個函數 這樣的函數就叫構造函數
          2. 在內存中開辟一塊(申請一塊空閑的空間)空間,存儲創建的新對象
          3. 構造函數中的this就設置為當前的對象
          4. 就是說當new寫在一個函數前面的時候、這個函數中的this就是創建出來的對象、并且函數的返回值直接默認就是this了 隱式返回,可以使用如下代碼進行測試得出結論 function Obj() {
            }
            //觀察返回值
            console.log(Obj());
            //undefined
            console.log(
            new Obj()); //Obj {}
            //所以this這個對象會返回, [ 這里的返回是自動的 無需在構造函數中使用return]
          5. 如果有設置對象的屬性和方法就設置值

          3.字面量的方式創建對象

          json對象是創建對象的一種字面量表示形式

          var 變量名={ } //這就叫字面量方式創建對象

          案例代碼

          var obj={};
          obj.name='張三';
          obj.age=22;
          obj.city='北京市';
          obj.fn=function () {
              console.log('我的名字叫'+this.name+' 我的年齡是:'+this.age+' 我在'+this.city+'生活和工作!');
          }
          
          obj.fn();

          推薦寫法:

          字面量優化后的形式:其實就是json數據格式的形式 [推薦寫法]

          案例代碼

          var obj2={
              name:'張三',
              age:22,
              city:'北京市',
              fn:function () {
                  console.log(this);
                  console.log('我的名字叫'+this.name+' 我的年齡是:'+this.age+' 我在'+this.city+'生活和工作!');
              }
          };
          
          obj2.fn();

          注意: var obj=new Object() 與 var obj={ } 是完全一樣的 只是一個在內存中的堆區中開空間 而另一個在棧區開辟空間

          function Obj() {
          	
          }
          var test=new Obj();  //在內存中的堆區中開空間
          console.log(test);
          
          var json={}			//在棧區開辟空間 用完即釋放
          console.log(json);



          極客小俊@,首發原創技術文章

          如果喜歡話請 "點贊 評論 收藏" 一鍵三連

          大家的支持就是我堅持下去的動力!

          多時候,我們在學習前端開發的時候,都以為只要學習好前端開發的語法就行了,或者說做做幾個動效,能寫出來就行了,卻都不知道,其實前端開發的設計模式也很重要!

          什么是設計模式

          設計模式(design pattern)是一套反復使用、思想成熟、經過分類和無數實戰設計經驗的總結。

          是為了代碼可重用、可擴展、可解耦、更容易被人理解和保證代碼可靠性。

          設計模式共有23種,今天我們來講的是工廠模式,其他模式我們后面會繼續給大家講

          工廠模式

          工廠模式,正像它的名字一樣,可以像工廠一樣生產出我們想要的東西,只要我們提供原料。在我們日常編寫代碼過程中,很可能,我們不知不覺中就已經使用過工廠模式。我們看一個簡單的例子:

          簡單的demo

          在這個函數中,我可以通過傳入不同的參數,創建具有不同參數值得對象。可以看到,工廠模式其實很簡單。

          工廠模式(Factory Pattern)主要分為簡單工廠模式和抽象工廠模式。

          簡單工廠模式

          簡單工廠(Simple Factory Pattern)模式主要用于創建同一類的對象,比如我們創建需要一個身份,老師或者學生。可以通過下面這個函數:

          簡單工廠模式

          我們可以傳入不同的 type 比如"student"或“teacher”去創建不同的對象,然后再通過不同的person對象去給里面的屬性賦值。無論是"student"或者"teacher"都是person,所以說簡單工廠函數就是用來創建同一類對象的不同實例。

          上面的代碼通過原型_prototype_去添加兩個函數,(關于原型的知識,不是一兩句可以講完的,如果不懂得話,大家可以到網上去搜索相關的資料進行了解)然后通過this[type]去選擇不同的方法,如果這里不明白的話我可以解釋一下,this是一個對象,指向當前函數(在JavaScript里函數是對象),然后this[屬性名/方法名] 去調用內部的屬性或方法,那么this[type] (person)就是調用對應的方法去實例化一個具體的類(student或teacher)。通過this[type] (person)去調用。

          這就是簡單工廠函數。

          抽象工廠模式

          抽象工廠模式 :與簡單工廠函數不同的是,抽象工廠函數會先設計好接口,具體的實現在子類中進行。這樣看概念有點模糊,我們來看一個例子:

          我們定義一個父類,abstractCreatePerson也就是創建一個人,然后這個人有一個自我介紹的方法方法selfIntroduction,那么不同的人就有不同的介紹內容,這個時候我們就可以用到抽象工廠模式:

          抽象工廠模式

          可以看到這段代碼,父類 abstractCreatePerson 中先聲明了一個方法,然后通過 Object.create() 方法去繼承這個父類,(因為這樣不會覆蓋原有的原型鏈),然后我們再在子類中去實例化方法,不同的子類就有了不同的實例方法。

          這就是工廠模式,他提高了我們代碼的可重用性,降低了模塊之間的耦合度。

          最后總結一下

          • 工廠模式,正像它的名字一樣,可以像工廠一樣生產出我們想要的東西,只要我們提供原料
          • 工廠模式提高了我們代碼的可重用性,降低了模塊之間的耦合度
          • ?工廠模式主要用于創建同一類的對象的不同實例

          Query基本操作

          jQuery對象

          jQuery對象是一個數組,可以通過數組下標轉為DOM對象

          // jQuery和DOM對象的互轉
          // 相當于window.onload
          $(function(){
            $("button").click(
              function () {
                alert("helloWorld");
                var $btn=$("button");
                alert($btn.length);
                // 使用數組下標來轉為DOM對象
                alert($btn[0].firstChild.nodeValue);
          
                var btn=document.getElementById("btn");
                // 使用$()進行包裝將DOM對象轉為jQuery對象
                alert($(btn).text());
              }
            )
          })
          

          基本選擇器

          基本選擇器根據id,class和標簽名來查找DOM元素

          • #id id選擇器
          • .class class選擇器
          • element 標簽選擇器
          • *匹配所有元素
          $("#id")
          $(".class")
          $("div")
          

          層次選擇器

          • 派生選擇器 $("div span") 選取div的所有span(后代)元素 不考慮層次
          • 父子選擇器 $("parent > child") 選取parent元素下的child元素
          • 直接兄弟選擇器 $("prev + next") 選取緊接在prev元素后的下第一個兄弟關系的next元素
          • 后續全部兄弟節點選擇器 $("prev ~ siblings") 選取prev元素后的所有兄弟關系的siblings元素

          ("prev ~ siblings")選擇器只能選擇"#prev"元素后面的同輩元素,而jquery中的方法siblings()與前后位置無關,只要是同輩節點就可以選取

          <div id="content">
            <span></span>
            <p>
              <span></span>
            </p>
            <p>
              <span></span>
            </p>
            <p>
              <span></span>
            </p>
          </div>
          
          $(function () {
            // 派生選擇器 $("div span")  選取div的所有span(后代)元素   不考慮層次
            var ele=$("div span");
            alert(ele.length); // 4
            // 父子選擇器 $("parent > child")  選取parent元素下的child元素
            var ele1=$("div > span");
            alert(ele1.length); // 1
          
            // 直接兄弟選擇器 $("prev + next")  選取緊接在prev元素后的下第一個兄弟關系的next元素
            var ele2=$("div span + p");
            alert(ele2.length); // 1
          
            // 后續全部兄弟節點選擇器 $("prev ~ siblings") 選取prev元素后的所有兄弟關系的siblings元素
            var ele3=$("div span ~ p");
            alert(ele3.length); // 3
          
          })
          

          過濾選擇器

          過濾選擇器通過特定的過濾規則來篩選出所需的DOM元素,該選擇器都以":"開頭

          按照不同的過濾規則,過濾選擇器可以分為基本過濾,內容過濾,可見性過濾,屬性過濾,子元素過濾和表單對象屬性過濾選擇器

          基本過濾選擇器

          • :first $("li:first") 選取第一個元素
          • :last $("li:last") 選取最后一個元素
          • :not(selector) $("li:not(.red)") 選取class不是red的li元素
          • :even $("li:even") 選取索引(0開始)是偶數的所有元素
          • :odd $("li:odd") 選取索引(0開始)是奇數的所有元素
          • :eq(index) $("li:eq(2)") 選擇索引等于index的元素
          • :gt(index) $("li:gt(2)") 選擇索引大于index的元素
          • :lt(index) $("li:lt(2)") 選擇索引小于index的元素
          • :header $(":header") 選擇標題元素 h1~h6
          • :animated $("animated") 選擇正在執行動畫的元素
          • :focus $(":focus") 選擇當前被焦點的元素

          內容過濾選擇器

          • :contains(text) $(":contains('com')") 選取含有"com"文本的元素
          • :empty $(":empty") 選取不包含子元素或空文本的元素
          • :has(selector) $("has(.red)") 選取含有class是red的元素
          • :parent $(":parent") 選取含有子元素或文本的元素

          可見性過濾選擇器

          • :hidden $(":hidden") 選取所有不可見元素
          • :visible $(":visible") 選取所有可見元素

          屬性過濾選擇器

          • [attribute] $("div[id]") 匹配包含給定屬性的元素,查找含有id屬性的div元素
          • [attribute=value] $("input[name='basketball']") 匹配給定屬性是某個特定值的元素,查找name屬性值為basketball的input元素
          • [attribute!=value] $("input[name!='basketball']") 匹配給定屬性是某個特定值的元素,查找name屬性值不為basketball的input元素
          • [attribute^=value] $("input[name^='foot']") 匹配給定的屬性是以某些值開始的元素
          • [attribute$=value] $("input[name$='end']") 匹配給定的屬性是以某些值結尾的元素
          • [attribute=value] $("input[name='com']") 匹配給定的屬性是包含某些值的元素
          • [selector1][selector2] $("input[id][name='aa']") 復合屬性過濾選擇器,同時滿足多個條件,找到含有id屬性,且name等于aa的元素

          子元素過濾選擇器

          • :first-child $("li:first-child") 獲取每個父元素的第一個子元素
          • :last-child $("li:last-child") 獲取每個父元素的最后一個子元素
          • :only-child $("li:only-child") 獲取只有一個子元素的元素
          • :nth-child(odd/even/eq(index)) 獲取每個自定義子元素的元素(索引值從1開始)

          表單對象屬性過濾選擇器

          • :enabled $("#form1:enabled") 選取id為form1所有可用元素
          • :disabled $("#form1:enabled") 選取id為form1所有不可用元素
          • :checked $("input:checked") 選取所有被選中的input元素(單選框、復選框)
          • :selected $("select option:selector") 選取所有被選中的選項元素(下拉框)

          操作文本節點

          使用text()方法

          // 讀取文本
          $("#bj").text();
          // 修改文本  將文本改成北京
          $("bj").text("北京");
          

          ### 操作屬性節點

          使用attr()方法

          //獲取屬性  獲取value屬性
          $("input[name='username']").attr("value");
          //修改屬性  修改value屬性值為張三
          $("input[name='username']").attr("value","張三");
          

          創建節點并插入節點

          創建節點

          使用jquery的工廠函數$(html) 會根據html來創建一個DOM對象,并把這個DOM對象包裝成一個jQuery對象

          插入節點

          創建好節點之后需要將創建的節點插入文檔中

          • append() 向每個匹配的元素的內部結尾處追加內容
          • appendTo() 將每個匹配的元素追加到指定元素中的內部結尾處
          • prepend() 向每個匹配元素的內部的開始處插入內容
          • prependTo() 向每個匹配的元素插入到指定的元素內部的開始處
          $("<li id='bj'>北京</li>").appendTo($("#city"));
          
          • after() 向每個匹配的元素之后插入內容
          • insertAfter() 向每個匹配的元素的插入到指定的元素之后
          • before() 向每個匹配的元素之前插入內容
          • insertBefore() 向每個匹配的元素的插入到指定的元素之前
          $("<li id='sh'>上海</li>").insertAfter($("#bj"));
          

          刪除節點

          • remove() 刪除所有匹配的元素,該節點包括子節點都被刪除
          • empty() 清空元素中所有后代節點(不包括屬性節點)
          $("#bj").remove();
          
          $("#city").empty();
          

          屬性操作

          可以使用attr()方法來進行屬性操作

          jQuery中提供了很多方法來實現獲取和設置某些屬性。

          • attr()
          • html() 讀取和設置某個元素中的HTML內容
          • text() 讀取和設置某個元素中的文本內容
          • val() 讀取和設置某個元素中的值 value屬性
          • height()
          • width()
          • css()

          removerAttr()可以刪除指定元素的指定屬性

          樣式操作

          • addClass() 追加樣式
          • removeClass() 移除樣式
          • toggleClass() 切換樣式
          • hasClass() 判斷元素中是否含有某個class

          事件操作

          加載事件

          $(document).ready() 網頁中所有的DOM繪制完畢后執行,可能DOM元素關聯的東西并沒有加載完,簡寫$() 與window.onload類似

          事件綁定

          對匹配的元素進行特定的事件綁定 bind()

          $(".class").bind("click",function(){
            alert("點擊事件綁定");
          })
          

          合成事件

          • hover() 模擬光標懸停事件,當光標移到元素上時,會觸發指定的第一個元素,光標移出這個元素時,觸發第二個函數
          • toggle() 模擬鼠標連續單擊事件,第一次單擊元素,觸發指定的第一個函數,再次單擊同一個元素,觸發指定的下一個函數

          移除事件

          • 移除某個元素上的某類事件 $("#btn").unbind("click")
          • 移除某個元素的所有事件 $("#btn").unbind()

          主站蜘蛛池模板: 亚洲无圣光一区二区| 看电影来5566一区.二区| av一区二区三区人妻少妇| 国产自产V一区二区三区C| 无码人妻精品一区二| 国产免费私拍一区二区三区| 91国偷自产一区二区三区| 国产在线一区二区视频| 日韩美女在线观看一区| 亚洲一区二区三区AV无码| 精品国产亚洲一区二区在线观看| 蜜芽亚洲av无码一区二区三区| 狠狠做深爱婷婷久久综合一区| 精品日韩一区二区| 一区二区三区视频免费观看 | 亚洲国产一区二区三区| 精品视频在线观看你懂的一区| 久久久久国产一区二区| 久久久国产精品一区二区18禁| 国产日韩精品视频一区二区三区| 亚洲sm另类一区二区三区| 一区二区三区亚洲视频| 国产精品一区二区久久国产| 奇米精品视频一区二区三区| 极品少妇一区二区三区四区| 国产精品一区三区| 日韩精品一区二区三区在线观看l| 日本不卡免费新一区二区三区| 亚洲综合在线成人一区| 日本无码一区二区三区白峰美| 日韩人妻不卡一区二区三区| 精品人妻无码一区二区色欲产成人| 国产乱码精品一区二区三区中文| 久久精品亚洲一区二区| 日本美女一区二区三区| 97久久精品无码一区二区| 爆乳熟妇一区二区三区| 日韩人妻不卡一区二区三区| 天堂不卡一区二区视频在线观看| 日韩人妻精品无码一区二区三区| 国产精品日韩一区二区三区|