成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

Guakin_Huang / 516人閱讀

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

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



    
111
222
333

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

window.onload=function(){
            //獲取元素
            var oParent=document.getElementById("div1");
            var btns=oParent.getElementsByTagName("button");
            var divs=oParent.getElementsByTagName("div");
            //通過循環(huán)給每個(gè)btn添加點(diǎn)擊事件
            for (var i = 0; i < btns.length; i++) {
                btns[i].index=i;//存儲(chǔ)當(dāng)前btn的下標(biāo)
                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";//讓對(duì)應(yīng)當(dāng)前btn的div顯示
                }
            }
        }

??對(duì)于小白,也就是和我一樣的人,一般就是寫出上面的代碼?,F(xiàn)在我們要用面向?qū)ο蟮乃枷雭砀膶?,首先我們要?duì)以上代碼進(jìn)行變形,使其不要出現(xiàn)函數(shù)的嵌套(如onload函數(shù)中就存在嵌套函數(shù)),變量可以改為全局變量,所以講以上代碼做出如下改變:變量變?yōu)槿肿兞浚殖鰜硪粋€(gè)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ù)制改過的代碼,此時(shí)面向?qū)ο蟮乃枷胍呀?jīng)初現(xiàn)端倪了。最后一步就是添加this了,因此將每個(gè)屬性前面都添加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";
        };

??以上代碼就完成了嗎?答案是否定的。為什么?還是因?yàn)閠his指向的問題。讓我們一個(gè)一個(gè)來看。首先構(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指向?yàn)閠his.btns[i],即當(dāng)前點(diǎn)擊的按鈕,因此在change()內(nèi)部,this.btns[i],this.divs[i]都不存在,因?yàn)閎tns和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)用方法。同時(shí)將this(指向當(dāng)前點(diǎn)擊的btn)以參數(shù)形式傳入change()中,這樣一個(gè)面向?qū)ο笏枷氲拇a就寫出來了。

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




    
    drag
    
    


    

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82393.html

相關(guān)文章

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

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

    springDevBird 評(píng)論0 收藏0
  • PHP學(xué)習(xí)路線圖

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

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

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

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

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

    DC_er 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<