成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

前端小白如何用面向?qū)ο笏枷雽懘a

Guakin_Huang / 539人閱讀

摘要:根據(jù)以上代碼的變形,我們現(xiàn)在用面向?qū)ο笏枷雭砭帉懘a,創(chuàng)建構(gòu)造函數(shù),添加屬性及方法。首先構(gòu)造函數(shù)中的,由于是用關(guān)鍵字,因此指向,沒問題。同時將指向當前點擊的以參數(shù)形式傳入中,這樣一個面向?qū)ο笏枷氲拇a就寫出來了。

??本人自學前端近半年,js達到熟練的水平,面向?qū)ο笏枷?、this指向有一定的了解,但是要用面向?qū)ο笏枷雽懘a就一臉懵逼了,最近看到某課堂的視頻(里面廣告嫌疑,就不說是啥了),覺得講的很好,因此想和大家分享一下,希望那些和我一樣有一定基礎(chǔ)但是不知道怎么寫的小伙伴也能愉快的寫代碼。
??我們以選項卡的實現(xiàn)為例,先給出html的結(jié)構(gòu)和樣式:



    
111
222
333

??我們先用過程式的編程思想來實現(xiàn),然后將其改為面向?qū)ο笏枷氲拇a。

window.onload=function(){
            //獲取元素
            var oParent=document.getElementById("div1");
            var btns=oParent.getElementsByTagName("button");
            var divs=oParent.getElementsByTagName("div");
            //通過循環(huán)給每個btn添加點擊事件
            for (var i = 0; i < btns.length; i++) {
                btns[i].index=i;//存儲當前btn的下標
                btns[i].onclick=function(){
                    for (var i = 0; i < btns.length; i++) {
                        btns[i].className="";
                        divs[i].style.display="none";
                    }
                    this.className="active";
                    divs[this.index].style.display="block";//讓對應(yīng)當前btn的div顯示
                }
            }
        }

??對于小白,也就是和我一樣的人,一般就是寫出上面的代碼?,F(xiàn)在我們要用面向?qū)ο蟮乃枷雭砀膶?,首先我們要對以上代碼進行變形,使其不要出現(xiàn)函數(shù)的嵌套(如onload函數(shù)中就存在嵌套函數(shù)),變量可以改為全局變量,所以講以上代碼做出如下改變:變量變?yōu)槿肿兞浚殖鰜硪粋€init()函數(shù)和change()函數(shù)。

        var oParent,btns,divs;
        window.onload=function(){
            oParent=document.getElementById("div1");
            btns=oParent.getElementsByTagName("button");
            divs=oParent.getElementsByTagName("div");
            init();
            
        };
        function init(){
            for (var i = 0; i < btns.length; i++) {
                btns[i].index=i;
                btns[i].onclick=change;
            }
        }
        function change(){
            for (var i = 0; i < btns.length; i++) {
                btns[i].className="";
                divs[i].style.display="none";
            }
            this.className="active";
            divs[this.index].style.display="block";
        }

??根據(jù)以上代碼的變形,我們現(xiàn)在用面向?qū)ο笏枷雭砭帉懘a,創(chuàng)建構(gòu)造函數(shù),添加屬性及方法。

window.onload=function(){
            var t1=new Tab();
            t1.init();
        };
        function Tab(){
            oParent=document.getElementById("div1");
            btns=oParent.getElementsByTagName("button");
            divs=oParent.getElementsByTagName("div");
        }
        Tab.prototype.init=function(){
            
            for (var i = 0; i < this.btns.length; i++) {
                btns[i].index=i;
                btns[i].onclick=change;
            }
        }
        Tab.prototype.change=function() {
            for (var i = 0; i < this.btns.length; i++) {
                btns[i].className="";
                divs[i].style.display="none";
            }
            className="active";
            divs[btn.index].style.display="block";
        };

??將結(jié)構(gòu)寫出來,復(fù)制改過的代碼,此時面向?qū)ο蟮乃枷胍呀?jīng)初現(xiàn)端倪了。最后一步就是添加this了,因此將每個屬性前面都添加this。

window.onload=function(){
            var t1=new Tab();
            t1.init();
        };
        function Tab(){
            this.oParent=document.getElementById("div1");
            this.btns=this.oParent.getElementsByTagName("button");
            this.divs=this.oParent.getElementsByTagName("div");
        }
        Tab.prototype.init=function(){
            
            for (var i = 0; i < this.btns.length; i++) {
                this.btns[i].index=i;
                this.btns[i].onclick=change();                    
            }
        }
        Tab.prototype.change=function() {
            for (var i = 0; i < this.btns.length; i++) {
                this.btns[i].className="";
                this.divs[i].style.display="none";
            }
            this.className="active";
            this.divs[this.index].style.display="block";
        };

??以上代碼就完成了嗎?答案是否定的。為什么?還是因為this指向的問題。讓我們一個一個來看。首先構(gòu)造函數(shù)中的this,由于是用new關(guān)鍵字,因此this指向t1,沒問題。init()方法,由于調(diào)用方式是t1.init(),this指向也為t1,沒問題。那問題肯定是在change()方法中了,首先看看其調(diào)用形式this.btns[i].onclick=change();其this指向為this.btns[i],即當前點擊的按鈕,因此在change()內(nèi)部,this.btns[i],this.divs[i]都不存在,因為btns和divs是t1的屬性,其他的this如this.className指向是正確的,因此我們要改變this指向,一般都是將this指向改為指向?qū)ο?,即t1。怎么改this指向?this指向與函數(shù)的調(diào)用方式有關(guān),因此作出如下改變。

Tab.prototype.init=function(){
            var This=this;
            for (var i = 0; i < this.btns.length; i++) {
                this.btns[i].index=i;
                this.btns[i].onclick=function(){
                    This.change(this);
                }
            }
        }
Tab.prototype.change=function(btn) {
            for (var i = 0; i < this.btns.length; i++) {
                this.btns[i].className="";
                this.divs[i].style.display="none";
            }
            btn.className="active";
            this.divs[btn.index].style.display="block";
        };

??首先在init()中,將this存在變量This中,用匿名函數(shù)中采用This.change(this);方式來調(diào)用方法。同時將this(指向當前點擊的btn)以參數(shù)形式傳入change()中,這樣一個面向?qū)ο笏枷氲拇a就寫出來了。

??不知道大家看了會不會對大家有所幫助,現(xiàn)在我用面向過程思想寫了一個拖拽的代碼,大家可以試著將其改為面向?qū)ο蟮拇a,代碼如下,過程中會有幾個坑,一個就是this指向的問題,另外一個就是事件函數(shù)的問題(ev只能出現(xiàn)在事件函數(shù)中)。最后跟大家分享一個小經(jīng)驗,事件和定時器很容易造成this指向的問題,因此在面向?qū)ο缶幊踢^程中要特別注意。




    
    drag
    
    


    

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/82393.html

相關(guān)文章

  • 前端小白面向對象思想實現(xiàn)元素拖拽

    摘要:上篇文章分享了如何用面向?qū)ο笏枷刖帉戇x項卡,在文章最后留了一個拖拽的例子,希望大家可以試著寫一下,現(xiàn)在我就談?wù)勎以谶@過程中遇到的一些問題和解決方法。通過以上方法來訓練面向?qū)ο蟮木幊趟枷?,多練習,以后寫出面向?qū)ο笏枷氲拇a就很簡單了。 上篇文章分享了如何用面向?qū)ο笏枷刖帉戇x項卡,在文章最后留了一個拖拽的例子,希望大家可以試著寫一下,現(xiàn)在我就談?wù)勎以谶@過程中遇到的一些問題和解決方法。(本文...

    springDevBird 評論0 收藏0
  • PHP學習路線圖

    摘要:學習路線圖建議最后買一個域名和阿里云服務(wù)器,真正的將代碼部署到云服務(wù)器上去,走一次上線流程,用一下管理一下代碼會更棒。建議學習路線圖這個時候使用寫一個大并發(fā)的多服務(wù)器的秒殺出來。 PHP學習路線圖 在網(wǎng)上很多人公布了太多的PHP學習路線圖,本人在互聯(lián)網(wǎng)公司工作十余年,也帶了很多PHP入門的新手,將他們的一些問題和學習路線圖為大家整理出來,希望很多小白少走彎路。 一、 網(wǎng)上某些錯誤的學習...

    wapeyang 評論0 收藏0
  • 前端基礎(chǔ)入門

    摘要:手把手教你做個人火的時候,隨便一個都能賺的盆滿缽滿,但是,個人沒有服務(wù)端,沒有美工,似乎就不能開發(fā)了,真的是這樣的嗎秘密花園經(jīng)典的中文手冊。涵蓋前端知識體系知識結(jié)構(gòu)圖書推薦以及入門視頻教程,全的簡直不要不要的了。 JavaScript 實現(xiàn)點擊按鈕復(fù)制指定區(qū)域文本 html5 的 webAPI 接口可以很輕松的使用短短的幾行代碼就實現(xiàn)點擊按鈕復(fù)制區(qū)域文本的功能,不需要依賴 flash。...

    shinezejian 評論0 收藏0
  • 回顧自己三次失敗的面試經(jīng)歷

    摘要:站在這個時間點上,我對自己之前三次失敗的面試經(jīng)歷做了一次深度回顧。關(guān)于我第三次面試失敗的經(jīng)歷,依然是與輪播圖有關(guān)。當然,這次思特奇面試之旅,最后也是以失敗告終,這也是我離進大廠最近的一次。 showImg(https://segmentfault.com/img/bVYQuP?w=528&h=513); 前言 時間的齒輪已經(jīng)來到了2017年的11月份,距離2018年僅僅還剩下不到兩...

    DC_er 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<