面向過程
面向對象
相信這些概念性的東西,網上真的是一搜一大堆,在我使用個人方法理解和上手面向對象以前,允許我把概念性的東西寫完,畢竟基礎特別重要啊。相信我,若是你正在閱讀,請忍耐一兩分鐘javascript
相關名詞
繼承
實現B繼承Ajava
好啦,概念性的東西就寫到這,下面開始個人代碼之旅,如今已經晚上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>
/*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"; }
/*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");
/*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!!!"; })
/*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!!!"; })
/*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真的神煩,不過多寫寫就行了,習慣就好,要學會控制它,若是你成功看完這篇文章,你就會發現,隨着版本(暫時就算版本吧)升級,功能也慢慢增多,靈活性更好,代碼的可擴展性更高啦,至於質疑一個簡單的功能至於寫這麼複雜嗎?函數
很好,我以爲面向對象編程就是造輪子的過程,輪子就至關於工具。打個比方,伐樹你會選擇電鋸仍是斧頭,劈柴你會選擇電鋸仍是斧頭,相信答案就在你內心,好了不寫了,真困了,快睡着了。工具