初試面向對象編程

面向對象編程

面向過程
  • javascript是一門面向過程的語言,也就是側重點是實現一件事的步驟。
  • 特色:有良好的可擴展性和重用性,下降了代碼間的耦合度,接近平常思惟。
面向對象
  • 以事物爲中心,側重於完成某件事所須要的事物的特徵和行爲的設計。
  • 特色:封裝、繼承、多態,耦合度低,複用度好。

相信這些概念性的東西,網上真的是一搜一大堆,在我使用個人方法理解和上手面向對象以前,允許我把概念性的東西寫完,畢竟基礎特別重要啊。相信我,若是你正在閱讀,請忍耐一兩分鐘javascript

相關名詞
  • prototype : 獲取構造函數的原型對象
  • constructor : 獲取原型對象的構造函數
  • --proto-- : 獲取實例對象的構造函數的原型對象
  • 原型鏈 : 構造函數自身會有原型對象,經過prototype查看,構造函數的實例對象自身也會有原型對象,經過--proto--查看,--proto--是object類型,當訪問一個實例化的屬性時,瀏覽器會先查找自身內部屬性,沒有就找--proto--,直到--proto--類型爲null。
  • New關鍵字做用:建立一個空對象,讓空對象調用構造函數給本身賦值,將該對象返回
繼承

實現B繼承Ajava

  1. 方式一:在B的構造函數內部寫A.call(this);缺點:參數設置不靈活
  2. 方式二:(使用原型鏈實現繼承)step1:改變自身原型對象B.prototype=new A();step2:修復原型對象指向的構造函數B.prototype.constructor=B

好啦,概念性的東西就寫到這,下面開始個人代碼之旅,如今已經晚上11:30整,我好瞌睡啊,太困了,把這個寫完我就去睡覺了Zzzz編程


基礎設置

國際慣例,先把代碼的基礎設置好瀏覽器

div,
            p {
                width: 100px;
                height: 30px;
                border: 1px solid #ddd;
                margin: 30px auto;
            }
            div.open,p.open{
                background: pink;
            }


            <body>
                <div></div>
                <div></div>
                <p></p>
                <p></p>
            </body>

1.基礎版

/*NO.1
         * 基礎方法
         * 缺點:代碼冗餘,重複獲取元素重複循環操做
         * 功能:修改背景色
         */

        var divs1 = document.getElementsByTagName("div");
        var ps1 = document.getElementsByTagName("p");
        for (var i = 0; i < divs1.length; i++) {
            divs1[i].style.backgroundColor = "pink";
        }
        for (var i = 0; i < ps1.length; i++) {
            ps1[i].style.backgroundColor = "pink";
        }

2.進階版(一)

/*NO.2
         * 進階方法
         * 缺點:太侷限,只能設置樣式
         * 功能:修改背景色
         */
        function getDOM(tagName){
            return document.getElementsByTagName(tagName);
        }
        function setStyle(arr,styleName,styleVal){
            for (var i = 0; i < arr.length; i++) {
                arr[i].style[styleName] = styleVal;
            }
        }
        var divs2 = getDOM("div");
        var ps2 = getDOM("p");
        setStyle(divs2,"backgroundColor","#00a09d");
        setStyle(ps2,"backgroundColor","#00a09d");

3.進階版(二)

/*NO.3
         * 進階方法
         * 缺點:代碼不利於閱讀,沒有結構化
         * 功能:修改寬度,填充文字,遍歷封裝
         */
        function getDOM(tagName){
            return document.getElementsByTagName(tagName);
        }
        function each(arr,callback){
            for (var i = 0; i < arr.length; i++) {
                callback(arr[i])
            }
        }
        var divs2 = getDOM("div");
        var ps2 = getDOM("p");
        each(divs2,function(tag){    
            tag.style.width = "200px";
            tag.innerText = "I have a pen!!!";
        })

4.進階版(三)

/*NO.4
         * 進階方法,傳統面向對象寫法(獨立做用域)
         * 功能:添加樣式,遍歷封裝
         */
        function Tool(bgColor){
            this.bgColor = bgColor||"#00a09d";
            this.getDom = function(tagName){
                return document.getElementsByTagName(tagName);
            };
            this.each = function(arr,callback){
                for (var i = 0; i < arr.length; i++) {
                    arr[i].style.backgroundColor = this.bgColor;
                    callback(arr[i]);
                }
            };
        }
        //實例化(使用)
        var tool = new Tool();
        var ps3 = tool.getDom("p");
        var divs3 = tool.getDom("div");
        tool.each(divs3,function(tag){    
            tag.style.width = "200px";
            tag.innerText = "I have a pen!!!";
        })

5.終極版

/*NO.5
         * 進階方法,ES6面向對象寫法(獨立做用域,類自己指向構造函數)
         * 功能:將傳入的對象變成紅色,填充文字,添加點擊效果(歪樓了,需求改爲這慫樣子了)
         * 說明:實例化以後當即實現以上功能
         * 功能:修改背景,填充文字,綁定事件......
         */
        class Tool{
            //構造函數(options爲實例化傳入的參數)
            //做用:設置默認參數,合併默認參數和傳入的參數,實現繼承
            constructor(options){
                let dafultOpations = {
                    element:"",
                    bgColor:"red",
                    color:"#fff"
                }
                
                this.options = Object.assign({},dafultOpations,options); //合併對象   assign(相同項會覆蓋) merge(相同項會合並)
                this.checkOptions().setStyle().setText().bindClick()  //實例化後當即執行這些方法,每一個方法在調用完成後必定要釋放this
            }
            //因爲該類的實現依賴於傳入的DOM,此方法用來確保已經傳入DOM,若實例化沒有傳入,則拋出異常
            checkOptions(){
                if(!this.options.element){
                    throw new Error("Element is required!!!")
                }
                return this;
            }
            setStyle(){
                for (var i = 0; i < this.options.element.length; i++) {
                    this.options.element[i].style.backgroundColor = this.options.bgColor;
                    this.options.element[i].style.textAlign = "center";
                    this.options.element[i].style.color = this.options.color;
                }
                return this;
            }
            setText(){
                for (var i = 0; i < this.options.element.length; i++) {
                    this.options.element[i].innerText = "呆呆Akuma";
                }
                return this;
            }
            bindClick(){
                for (var i = 0; i < this.options.element.length; i++) {
                    let __this = this.options.element[i];  //需將當前的元素區分開 __this!=this
                    let flag = false;
                    __this.addEventListener("click",()=>{
                        if(flag = !flag){                            
                            __this.style.backgroundColor = "pink"
                        }else{
                            __this.style.backgroundColor =     this.options.bgColor;                    
                        }
                    })
                }
                return this;
            }
        }
        
        
        
        var divs = new Tool({
            element:document.getElementsByTagName("div"),
            bgColor:"#00a09d"
        });
        var ps = new Tool({
            element:document.getElementsByTagName("p"),
            bgColor:"#f48"
        });

目前看起來,這個終極版好像是最繁瑣的,首先我要說明,這裏只是介紹面向對象編程是怎麼回事,對於漫天飛的this真的神煩,不過多寫寫就行了,習慣就好,要學會控制它,若是你成功看完這篇文章,你就會發現,隨着版本(暫時就算版本吧)升級,功能也慢慢增多,靈活性更好,代碼的可擴展性更高啦,至於質疑一個簡單的功能至於寫這麼複雜嗎?函數

很好,我以爲面向對象編程就是造輪子的過程,輪子就至關於工具。打個比方,伐樹你會選擇電鋸仍是斧頭,劈柴你會選擇電鋸仍是斧頭,相信答案就在你內心,好了不寫了,真困了,快睡着了。工具

相關文章
相關標籤/搜索