# JS 筆記 ## 物件導向5原則(SOLID) ### 【S-單一功能原則】 每一個物件,單一功能概念 ex. 方向盤 => 控制方向 寫多一點class ### 【O-開閉原則】 外部開放,內部封閉(新需求已擴充、非修改) ### 【L-替換原則】 ### 【I-介面隔離原則】 ### 【D-依賴反轉原則】 ### 【避免高耦合】 ex. 今天單一物件中修改A會影響到B,不符合單一功能原則 * 資料與商業邏輯混再一起(高耦合) OOP 物件導向 # JS 假物件導向class語法糖 使用new的時候大概都做了哪些事情? 1. var People = {}; //我們建立了一個空物件People 2. People.__proto__ = Object.prototype; //我們將這個空物件的__proto__成員指向了Object函式物件prototype成員物件 3. Object.call(People); //我們將Object函式物件的this指標替換成People,然後再呼叫Object函式 ```javascript= ex.1 自訂類別 { class } 非實體,不像其他物件導向語言沒有真的類別!is fake!,打出來的是涵式!! class Persion { constructor(name) { // 帶進來的參數,指定給this.name 會產生 { name: name } 的物件 this.name = name; } sayH() { console.log(this.name) } } Jack = new Persion("dog"); Jack.sayH(); // "dog" ------------------------------------------------------------------------------ ex.2 JS本身所擁有的類別 // String式類別方法 const str = new String('字串') // 使用String 裡的length涵式 // str 是 String 的實體 str.length // 2 ------------------------------------------------------------------------------ ex.3 繼承類別 { extends } // 建立一個類別 class Persion { constructor(name) { ... } personInfo() { console.log(...) } } // 想讓A類別繼承B類別 CoolPerson extends Person { // ... } let coolPerson = new CoolPerson; // 就可以繼承Persion 使用 Persion 的方法了!! coolPerson.personInfo(); ------------------------------------------------------------------------------ ex.4 "覆寫"母類別的方法 與 在子類別"呼叫母類別"的方法 class Animal { constructor(ago) { this.ago = ago } animalInfo() { console.log("我愛你") } } // 繼承 class Rabbit extends Animal { constructor () { super(); } // 再寫一次覆蓋母類別的方法,讓user呼叫 animalInfo的時候,會走這。 animalInfo() { // { super } 直接呼叫母類別的方法 super.animalInfo() // "我愛你" console.log("我不愛你") // "我不愛你" } } let rabbit = new Rabbit(); rabbit.animalInfo(); // "我愛你" "我不愛你" ------------------------------------------------------------------------------ ex.5 利用super覆寫constructor class Animal { constructor(name) { this.name = name } } class Rabbit extends Animal { constructor(name, earLemgth) { // 母類別已有 this.name,不需要再類別寫 super(name); this.earLength = earLength; } } let rabbit = new Rabbit('Jobh', 5)\ async uploadOTAFile({ commit }, formdata) { let res = await api.upload("/api/deviceFile/v1_2/uploadOTAFile", formdata, { onUploadProgress: function(progressEvent) { var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total); commit("SET_STATE", { target: "progressData", data: { uploadFirmware: percentCompleted, }, }); }, } ); commit("SET_STATE", { target: "progressData", data: { uploadFirmware: 0, }, }); return res; }, async uploadOTAFile({ commit }, formdata) { let res = await api.upload("/api/deviceFile/v1_2/uploadOTAFile", formdata, { onUploadProgress: function(progressEvent) { var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total); commit("SET_STATE", { target: "progressData", data: { uploadFirmware: percentCompleted, }, }); }, } ); commit("SET_STATE", { target: "progressData", data: { uploadFirmware: 0, }, }); return res; }, # 陣列篇