摘要:解耦優(yōu)勢代碼復(fù)用,單元測試。常用比較誤區(qū)可同時(shí)判斷,可用來判斷對象屬性是否存在。使用作判斷無法進(jìn)行充分的類型檢查。文件中應(yīng)用常量參考文檔高級程序設(shè)計(jì)作者以樂之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。
編寫可維護(hù)性代碼
可維護(hù)的代碼遵循原則:
可理解性 (方便他人理解)
直觀性 (一眼明了)
可適應(yīng)性 (數(shù)據(jù)變化無需重寫方法)
可擴(kuò)展性 (應(yīng)對未來需求擴(kuò)展,要求較高)
可調(diào)試性 (錯(cuò)誤處理方便定位)
命名方式變量取名多為為名詞,方法取名多為為動詞
// 變量名 car, person; // 方法名 getName, isEnable;解耦
功能過于依賴,代碼耦合過緊,不利于維護(hù)。而通過解耦能讓我們更專一地處理特定功能業(yè)務(wù)的開發(fā),也方便我們開發(fā)中調(diào)試,從復(fù)雜的耦合依賴中抽離出來。
解耦優(yōu)勢:代碼復(fù)用,單元測試。
解耦原則:
HTML/JavaScript解耦(結(jié)構(gòu)層/行為層的解耦)
CSS/JavaScript解耦 (樣式層/行為層的解耦)
應(yīng)用邏輯/事件處理程序解耦
應(yīng)用邏輯/事件處理程序解耦合的原則:
勿將event對象傳給其他方法;只傳來自event對象中所> 需的數(shù)據(jù)
任何可以在應(yīng)用層面的動作都應(yīng)該可以在不執(zhí)行任何事> 件處理程序的情況下進(jìn)行;
任何事件處理程序都應(yīng)該處理事件,然后將處理轉(zhuǎn)交給應(yīng)用邏輯
// 一個(gè)事件解耦的例子 var pwdInput = document.getElementById("password"); // 回車事件 pwdInput.addEventListener("keyup", function(event){ if (event.keyCode == 13) { validatePassword(event.target.value); } }) // 失焦事件 pwdInput.addEventListener("blur", function(event) { validatePassword(event.target.value); }) // 業(yè)務(wù)應(yīng)用多帶帶封裝到一個(gè)方法里面,多處復(fù)用/單元測試皆可 function validatePassword(pwd) { if (!pwd) { alert("密碼不能為空!"); } }對象所有權(quán)
JavaScript中是通過原型鏈來實(shí)現(xiàn)繼承,而原型繼承的一個(gè)特點(diǎn)就是原型上定義的屬性方法,可以被多個(gè)實(shí)例共享使用。
對象維護(hù)原則:
不要為實(shí)例或原型添加屬性
不要為實(shí)例或原型添加方法
不要重定義已存在的方法
需要修改對象時(shí):
創(chuàng)建包含所需功能的新對象,并用它與相關(guān)對象進(jìn)行交互
創(chuàng)建自定義類型,繼承需要進(jìn)行修改的類型,然后可以自定義類型添加額外功能
全局變量引申命名空間var name = "KenTsang"; function sayName () { console.log(name); } var MyApp = { name: "KenTsang", sayName: function() { console.log(this.name); } skill: { html: 80, css: 80, js: 80 } } MyApp.skill.js // 80
雖然減少程序員輸錯(cuò)代碼造成修改全局變量的幾率,但依舊可以修改到全局變量,而且增加了代碼量。
常用null比較誤區(qū)TIPS: null可同時(shí)判斷null/undefined,可用來判斷對象屬性是否存在。
使用null作判斷無法進(jìn)行充分的類型檢查。
// 錯(cuò)誤用法 function sortArrays(values) { if (values != null) { // 非數(shù)組類型就會報(bào)錯(cuò),因?yàn)閟ort方法只有Array才具備 values.sort(); } } // 正確用法 if (values instanceof Array) { value.sort(); }
使用null比較的代碼,替換原則:
如果值應(yīng)為一個(gè)引用類型,使用instanceof操作符檢查其構(gòu)造函數(shù)
如果值應(yīng)為一個(gè)基本類型(值類型),使用typeof檢查其類型
如果是希望對象包含某個(gè)特點(diǎn)的方法名,則使用typeof操作符確保指定名字的方法存在于對象上
// 值類型 (Number, String, Boolean) typeof value == "string"; // 引用類型 (Array, Object, Function) value instanceof Array; // 對象方法 (Object.property) typeof person.getName == "function"常量應(yīng)用
var CONSTANS = { INVALID_VALUES_MSG: "Invalid value!", INVALID_VALUE_URL: "/erros/invalid.php" } CONSTANS.INVALID_VALUES_MSG // "Invalid value!"
常量應(yīng)用原則:
重復(fù)值——多處地方引用的值 (CSS類名/后端返回的狀態(tài)碼)。
用戶界面字符串——顯示給用戶的字符串 (國際化, 替換為對應(yīng)的語言包文件)
URLs——公共地方存放所有的URL (測試API的URL/上線API的URL)
任何可能會更改的值 (通常是環(huán)境/語言配置上的修改)
redux/vuex的actionType判斷的應(yīng)用,也是常量應(yīng)用常見的場景。好處就是引用時(shí)拼寫錯(cuò)誤會直接拋出變量引用錯(cuò)誤,而直接用字符串值判斷,則不會拋出錯(cuò)誤,不利于調(diào)試。
// redux-reducer.js文件中應(yīng)用常量 import { ADD_TODO_ITEM, DELETE_TODO_ITEM } from "./actionTypes" const defaultState = { inputValue: "", list: [] }; export default (state = defaultState, action) => { let newState = JSON.parse(JSON.stringify(state)); switch (action.type) { case DELETE_TODO_ITEM: newState.list.splice(action.value, 1); break; case ADD_TODO_ITEM: if (newState.inputValue.trim().length) { newState.list.push(newState.inputValue); } newState.inputValue = ""; break; } return newState; }
參考文檔
《JavaScript高級程序設(shè)計(jì)》
作者:以樂之名
本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。轉(zhuǎn)載請指明出處。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/99667.html
摘要:文件內(nèi)部使用使用到的代碼引入外部文件外部代碼的地址標(biāo)簽的位置一般情況下,標(biāo)簽的位置放在標(biāo)簽中引入代碼頁面結(jié)構(gòu)對于需要引入很多的中間,如果把放在頭部,無疑會導(dǎo)致瀏覽器呈現(xiàn)頁面出現(xiàn)延遲,就是導(dǎo)致頁面出現(xiàn)空白。頁面結(jié)構(gòu)引入代碼 這篇筆記的內(nèi)容對應(yīng)的是《JavaScript高級程序設(shè)計(jì)(第三版)》中的第二章。 1.使用方式 在HTML中使用 JavaScript 的方式有兩種,第一種就是直接內(nèi)...
摘要:由于計(jì)算機(jī)的國際化,組織的標(biāo)準(zhǔn)牽涉到很多其他國家,因此組織決定改名表明其國際性。規(guī)范由萬維網(wǎng)聯(lián)盟制定。級標(biāo)準(zhǔn)級標(biāo)準(zhǔn)是不存在的,級一般指的是最初支持的。 這篇筆記的內(nèi)容對應(yīng)的是《JavaScript高級程序設(shè)計(jì)(第三版)》中的第一章。 1.ECMA 和 ECMA-262 ECMA 是歐洲計(jì)算機(jī)制造商協(xié)會的縮寫,全程是 European Computer Manufacturers Ass...
摘要:而事件分為個(gè)級別級事件處理程序,級事件處理程序和級事件處理程序。級中沒有規(guī)范事件的相關(guān)內(nèi)容,所以沒有級事件處理。 showImg(https://segmentfault.com/img/bVburYR?w=499&h=400); HTML依托于JavaScript來實(shí)現(xiàn)用戶與WEB網(wǎng)頁之間的動態(tài)交互,接收用戶操作并做出相應(yīng)的反饋,而事件在此間則充當(dāng)橋梁的重要角色。 日常開發(fā)中,經(jīng)常會...
摘要:表示應(yīng)該立即下載腳本,但不應(yīng)妨礙頁面中的其他操作可選。表示通過屬性指定的代碼的字符集。表示腳本可以延遲到文檔完全被解析和顯示之后再執(zhí)行。實(shí)際上,服務(wù)器在傳送文件時(shí)使用的類型通常是,但在中設(shè)置這個(gè)值卻可能導(dǎo)致腳本被忽略。 第1章 JavaScript 簡介 雖然JavaScript和ECMAScript通常被人們用來表達(dá)相同的含義,但JavaScript的含義比ECMA-262要多得多...
摘要:用于把對象序列化字符串,在序列化對象時(shí),所有函數(shù)及原型成員都會被有意忽略,不體現(xiàn)在結(jié)果中。對第步返回的每個(gè)值進(jìn)行相應(yīng)的序列化。參考文檔高級程序設(shè)計(jì)作者以樂之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVburW1?w=658&h=494); JSON與JavaScript對象 JSON是一種表示結(jié)構(gòu)化數(shù)據(jù)的存儲格式,語...
閱讀 1190·2023-04-26 02:42
閱讀 1636·2021-11-12 10:36
閱讀 1790·2021-10-25 09:47
閱讀 1267·2021-08-18 10:22
閱讀 1806·2019-08-30 15:52
閱讀 1216·2019-08-30 10:54
閱讀 2637·2019-08-29 18:46
閱讀 3501·2019-08-26 18:27