---
# System prepended metadata

title: '1100303'
tags: [share]

---

---
tags: share
disqus: hackmd
---


1100303
===

關於 Promise
---
* `new Promise()` 為實例化一個 `Promise Class`，`()`須傳入帶 ==成功`resolve（自定義）`== 和 ==失敗`reject（自定義）`== 參數的 `function`。
* 可只帶一個參數，則代表成功時參數。
* 因為較複雜，所以通常用在第三方套件，如 `ajax return` 的也是一個 `promise`，所以可以寫 `$ajax().then()`。
* 語法糖 `async` （ES7）
    * `async` 搭配 `await`
    * 強制將非同步事件轉為同步事件（實際上是讓其看起來像同步）。
    * 通常打 API 都是非同步。
    * 缺點：不適合寫太長，因此還是建議寫 `then` 比較彈性。
    * `try{}`、`catch{}`：先執行`try{}`，`try{}`有錯誤即跳到`catch{}`。


JS 小知識
---
* `function` 型參：定義 `function` 時的所自定義的名稱。
* `function` 實參：呼叫函式時所傳入的參數。
* `console.log()` 時，可將物件用 `{}` 包起來，如 `console.log({data})`（等同於`console.log({data:data})`），此寫法會多印出物件名稱。
* `for` 語法底層都是 `Iterator`。
* `if(){}else{}`有短路寫法`&&`。



關於DTO
---
* DTO 就是在作資料轉換（把收到的資料轉成我要用的資料格式）
```javascript=
// ========== Vue 畫面 ==========
// 點擊按鈕時呼叫 open()
// open()主要功能為將資料寫進表格相對應欄位，因此open內會對資料格式作處理。
// 即使兩者資料格式一模一樣，還是會透過DTO處理，避免日後資料修改新增）。
open(data?: IBKE0205LinkItem) {
console.log({ data });
this.dialog = true;
if (data) {
  const { imageData, ...etc } = data; // 因為資料從外部來所以在此解構
  const { imageId } = imageData; // 因為資料從外部來所以在此解構
  const { pageId } = this; // 因為資料從外部來所以在此解構
  this.form = new BKE0205EditLinkReqDTO({ ...etc, pageId, imageId });
}
}

// ========== TypeScript 畫面 ==========
export class BKE0205EditLinkReqDTO {
  // 將資料在建構式中作解構，以利此 class 在 new BKE0205EditLinkReqDTO()時，自動將資料帶入正確位置
  constructor(data?: BKE0205EditLinkReqDTO) { // 問號表示 data 可能為空
    if (!data) return;
    const { 
      linkId = 0,
      pageId = 0,
      title = "",
      subTitle = "",
      desc = "",
      linkUrl = "",
      labelId = 0,
      beginDT = "",
      endDT = "",
      status = StatusEnum.ACTIVE,
      top = StatusEnum.ACTIVE,
      imageId = 0
    } = data;
    this.linkId = linkId;
    this.pageId = pageId;
    this.title = title;
    this.subTitle = subTitle;
    this.desc = desc;
    this.linkUrl = linkUrl;
    this.labelId = labelId;
    this.beginDT = beginDT;
    this.endDT = endDT;
    this.status = status;
    this.top = top;
    this.imageId = imageId;
  }
  // 強型別語言本身就需要先定義資料型態
  linkId?: number = 0; //	Integer	連結ID
  pageId = 0; //	Integer	頁面ID
  title = ""; //	String	連結標題
  subTitle = ""; //	String	連結副標題
  desc = ""; //	String	連結簡介
  linkUrl = ""; //	String	URL
  labelId = 0; //	Integer	標籤ID
  beginDT = ""; //	String	發布時間	YYYYMMDDhhmmss
  endDT = ""; //	String	結束時間	YYYYMMDDhhmmss
  status = StatusEnum.ACTIVE; //	String	上下架	Y / N
  top = StatusEnum.ACTIVE; //	String	置頂	Y / N
  imageId = 0; //	Integer	圖片ID
}
```

TypeScript
---
* `class` 的屬性和方法，都要先定義型別。
* `inerface` 內只定義型別，用於約束物件的型別用，例如 API 的回傳值、要傳入 `function` 的參數。沒有 `constructor` 所以不能 `new`（無法被量產）。
* 用`$refs`方法時，通常會搭配`<>`強轉型，如`(<any>this.$refs.douvuments).open(item)`;
    * ref 是標記在 html 元素上的`<tag-name ref="">`，`js`裡有防呆寫法`(<any>this.$refs.douvuments)?.open(item)`，`?`表示前方物件可能沒有，`data?:`表示該 `data` 可能為空

寫 Code 習慣
---
* 常量：全大小的變數命名方式，表示值不改變。
* 函式由 on 開頭


Vue
---
* Vue component 繼承 Vue 的所有屬性跟方法
* get、set：Vue 把 get 跟 set 覆蓋掉
* get()、set()是prototype都會有的方法，下方寫法等同於A = "a"，CCC將取得A = "a";
<!-- class CCC{
    get A(){
        return "a"
    }
    set A(){
        return "a"
    }
} -->


==看 evernote vuetify & vue 規則==

