前端小白如何用面向對象思想寫代碼

??本人自學前端近半年,js達到熟練的水平,面向對象思想达吞、this指向有一定的了解,但是要用面向對象思想寫代碼就一臉懵逼了荒典,最近看到某課堂的視頻(里面廣告嫌疑酪劫,就不說是啥了),覺得講的很好寺董,因此想和大家分享一下覆糟,希望那些和我一樣有一定基礎但是不知道怎么寫的小伙伴也能愉快的寫代碼。
??我們以選項卡的實現(xiàn)為例螃征,先給出html的結構和樣式:

<style type="text/css">
        #div1 div{
            width: 200px;
            height:200px;
            border: 1px #000 solid;
            display: none;
        }
        .active{
            background: red;
        }
</style>
<body>
    <div id="div1">
        <button class="active">1</button>
        <button>2</button>
        <button>3</button>
        <div style="display: block;">111</div>
        <div>222</div>
        <div>333</div>
    </div>
</body>

??我們先用過程式的編程思想來實現(xiàn)搪桂,然后將其改為面向對象思想的代碼。

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';//讓對應當前btn的div顯示
                }
            }
        }

??對于小白盯滚,也就是和我一樣的人踢械,一般就是寫出上面的代碼。現(xiàn)在我們要用面向對象的思想來改寫魄藕,首先我們要對以上代碼進行變形内列,使其不要出現(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)在用面向對象思想來編寫代碼交排,創(chuàng)建構造函數(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';
        };

??將結構寫出來埃篓,復制改過的代碼,此時面向對象的思想已經(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指向的問題裤纹。讓我們一個一個來看委刘。首先構造函數(shù)中的this,由于是用new關鍵字鹰椒,因此this指向t1锡移,沒問題。init()方法吹零,由于調用方式是t1.init()罩抗,this指向也為t1,沒問題灿椅。那問題肯定是在change()方法中了套蒂,首先看看其調用形式this.btns[i].onclick=change();其this指向為this.btns[i],即當前點擊的按鈕茫蛹,因此在change()內部操刀,this.btns[i],this.divs[i]都不存在婴洼,因為btns和divs是t1的屬性骨坑,其他的this如this.className指向是正確的,因此我們要改變this指向,一般都是將this指向改為指向對象欢唾,即t1且警。怎么改this指向?this指向與函數(shù)的調用方式有關礁遣,因此作出如下改變斑芜。

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);方式來調用方法杏头。同時將this(指向當前點擊的btn)以參數(shù)形式傳入change()中,這樣一個面向對象思想的代碼就寫出來了沸呐。


??不知道大家看了會不會對大家有所幫助醇王,現(xiàn)在我用面向過程思想寫了一個拖拽的代碼,大家可以試著將其改為面向對象的代碼崭添,代碼如下寓娩,過程中會有幾個坑,一個就是this指向的問題滥朱,另外一個就是事件函數(shù)的問題(ev只能出現(xiàn)在事件函數(shù)中)根暑。最后跟大家分享一個小經(jīng)驗,事件和定時器很容易造成this指向的問題徙邻,因此在面向對象編程過程中要特別注意排嫌。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>drag</title>
    <style type="text/css">
        #div1{
            width: 100px;
            height: 100px;
            background: red;
            position: absolute;
        }
    </style>
    <script type="text/javascript">
        window.onload=function(){
            var oDiv=document.getElementById('div1');
            
            var disX=0;
            var disY=0;

            oDiv.onmousedown=function(ev){
                var ev=ev || window.event;
                disX=ev.clientX-oDiv.offsetLeft;
                disY=ev.clientY-oDiv.offsetTop;

                document.onmousemove=function(ev){
                    var ev=ev || window.event;
                    oDiv.style.left=ev.clientX-disX+'px';
                    oDiv.style.top=ev.clientY-disY+'px';
                };
                document.onmouseup=function(){
                    document.onmousemove=null;
                    document.onmouseup=null;
                }
                return false;
            }
        }
    </script>
</head>
<body>
    <div id='div1'></div>
</body>
</html>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缰犁,隨后出現(xiàn)的幾起案子淳地,更是在濱河造成了極大的恐慌,老刑警劉巖帅容,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颇象,死亡現(xiàn)場離奇詭異,居然都是意外死亡并徘,警方通過查閱死者的電腦和手機遣钳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麦乞,“玉大人蕴茴,你說我怎么就攤上這事〗阒保” “怎么了倦淀?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長声畏。 經(jīng)常有香客問我撞叽,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任愿棋,我火速辦了婚禮科展,結果婚禮上,老公的妹妹穿的比我還像新娘初斑。我一直安慰自己辛润,他們只是感情好膨处,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布见秤。 她就那樣靜靜地躺著,像睡著了一般真椿。 火紅的嫁衣襯著肌膚如雪鹃答。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天突硝,我揣著相機與錄音测摔,去河邊找鬼。 笑死解恰,一個胖子當著我的面吹牛锋八,可吹牛的內容都是我干的。 我是一名探鬼主播护盈,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼挟纱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腐宋?” 一聲冷哼從身側響起紊服,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胸竞,沒想到半個月后欺嗤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡卫枝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年煎饼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片校赤。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡吆玖,死狀恐怖,靈堂內的尸體忽然破棺而出痒谴,到底是詐尸還是另有隱情衰伯,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布积蔚,位于F島的核電站意鲸,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜怎顾,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一读慎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧槐雾,春花似錦夭委、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至擎值,卻和暖如春慌烧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸠儿。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工屹蚊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人进每。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓汹粤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親田晚。 傳聞我的和親對象是個殘疾皇子嘱兼,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法肉瓦,內部類的語法遭京,繼承相關的語法,異常的語法泞莉,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品哪雕,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式鲫趁。簡單...
    舟漁行舟閱讀 7,726評論 2 17
  • title: js面向對象date: 2017年8月17日 18:58:05updated: 2017年8月27日...
    lu900618閱讀 564評論 0 2
  • 我們不管做啥斯嚎,都要有目標,無論是在工作挨厚,學習堡僻,生活,還是人際關系上都應該有明確的目標疫剃,這樣才可以讓自己做事更清晰钉疫,...
    小鵬strive閱讀 294評論 1 1
  • 9月份執(zhí)行情況分析 本月的問題與改進 定下的好好學習閱讀木有完成,基本上一天的時間都是在工作上的事巢价,想說在上班的時...
    樓上的藝術家閱讀 93評論 0 0