2021年1月26日 星期二

初探 JavaScript 的 class 語法

 初探 JavaScript 的 class 語法

前言

  最近發現新的 JavaScript 有支援 class 語法,所以就來做個學習,在此做個紀錄。


內容

  先看以下範例

class MyClass{
  constructor(){
    this.publicMember = 'public';
    this._privateMember = 'private';
    this._propertyName = '';
    console.log( 'MyClass.constructor()' );
  }
  publicCall(){
    console.log( 'MyClass.publicCall()');
  }
  _privateCall(){
    console.log( 'MyClass._privateCall()');
  }
  get name(){
    return this._propertyName;
  }
  set name( newName ){
    this._propertyName = newName;
  }
  static staticCall(){
    console.log( 'MyClass.staticCall()');
  }
}
//
class MyExtendClass extends MyClass{
  constructor(){
    super();//Not super.constructor()!
    console.log( 'MyExtendClass.constructor()' );
  }
  publicCall(){
    console.log( 'MyExtendClass.publicCall()');
  }
}
//
MyClass.staticCall();//"MyClass.staticCall()"
let a = new MyClass();
a.name = 'Hello';
console.log( a.name );//"Hello"
a.publicCall();//"MyClass.publicCall()"

//
let b = new MyExtendClass();
b.name = 'Hello Extends';
console.log( b.name );//"Hello Extends"
b.publicCall();//"MyExtendClass.publicCall()"


這次的範例有"MyClass"與"MyExtendClass",兩者為繼承關係,在 class 可以看到 constructor() ,這是語法並不能自己改,如果熟悉 OOP 應該可以猜的到是"建構式",設定變數可以透過"this",跟舊的寫法一樣,但要注意 class 並不支援任何 private 的成員與方法,所以用了一個變通的方法就是在 private 的成員與方法錢加一個"_"來區隔是 public 或 private  ,最後會看到"_propertyName"這個成員, class 的語法有支援 get 與 set 來取得屬性,寫法相當直覺,僅需加  get 或 set 的語法再加上屬性名稱就可以新增,方法的部分也是用類似的方法來加,但前方不需要加任何關鍵字,static 的寫法也相當簡單,在方法前用 static 來區分即可。接著看到雞城的類別"MyExtendClass",這裡注意建構式的地方是如何喚起子類別的建構式,是 super() 而非 super.constructor() ,MyExtendClass.publicCall() 會發生 override ,如果要換起子類別的方法依舊可以透過 super 來喚起。


  總體來說語法相當簡潔與直觀,舊的寫法可是很容易需要寫一堆 prototype ,造成行數很能縮短讓程式碼看起來很雜,不過不支援 private 這樣的能見度算是小小的缺陷,比較訝異的是 property 的支援,因為舊的寫法雖然可以有 property ,但看起來就是個 funciton ,不能直接向變數一樣直接指派,而且 get 和 set 還要命兩種不同的名稱,這次的語法可以改善這樣的缺陷。


參考資料

[ developer.mozilla.org ] Classes

2021年1月19日 星期二

關於修理 Sony Xperia XA2 麥克風沒辦法收音的問題

關於修理 Sony Xperia XA2 麥克風沒辦法收音的問題

前言

  我的手機( Sony Xperia XA2 )先前因為電池膨脹,所以我自行更換了電池,但換完後沒多久發現麥克風遽然沒辦法收音,所以我必須拆開它再修理,在此把過程做個紀錄。


內容

  由於先前換電池時幾乎要把整個內構拆解,所以覺得修理應該很花時間,不過再次看了拆解影片 [ www.bilibili.com ] Sony 中端机型 Xperia XA2 Ultra 全拆解 後,發現麥克風只要拆完外殼後就可以看看是什麼問題,先看下圖

修理的說明圖片

在圖中會看到"麥克風電路板"與"USB介面電路板",這兩塊電路板的連接方式"非常奇特",不是用電線或是排線,而是只有給電路接點,當我刻意壓住這裡時,麥克風遽然就正常了!所以問題就是我沒把兩塊蓋板上的螺絲鎖到最緊,造成麥克風電路板接觸不良,我本以為螺絲不要鎖到最僅是個好習慣,沒想到這次遽然變成一個缺點,在我鎖緊後用語音助理測試收音後就確定是這個問題了。題外話,我真覺得這個設計超爛,像是相機與前鏡頭都有給排線,只有此處不給排線,如果螺絲鬆了,就有可能發生接觸不良,加上現在手機殼都要用熱風槍開相當麻煩,真沒想到是用這種低成本的方式連接。


  如果不是電池膨脹加上離我家最近的 Sony 維修中心跟我說"你來這裡維修我只是幫你寄到台北維修而已",我想我大概根本不會想拆手機自己換電池,準備相關工具就相當麻煩,封住手機殼的膠水只能上網買,千萬別用雜牌瞬間膠黏,根本黏不住,不過也在這次的經驗發現 Android 這個作業系統遽然可以熱插拔硬體(麥克風),作業系統不會跳警告,盛致用錄音軟體錄音時也不跳任何警告,只是會單純錄不到聲音而已,真是有趣的設計。


參考資料

[ www.bilibili.com ] Sony 中端机型 Xperia XA2 Ultra 全拆解

 

2021年1月12日 星期二

JavaScript 的格式化字串的新方法

 JavaScript 的格式化字串的新方法

前言

  最近要在 JavaScript 格式化字串時想起新規格有個語法可以很方便的格式化字串,既然會忘記就把它做個紀錄。


內容

  範例程式碼如下

let a = 5;
let b = 10;
//old
console.log( 'a + b = ' + ( a + b) );
console.log( a + ' + ' + b + ' = ' + ( a + b) );
//"a + b = 15"
//"5 + 10 = 15"
//
//new
console.log( `a + b = ${ a + b}` );
console.log( `${a} + ${b} = ${ a + b}` );
//"a + b = 15"
//"5 + 10 = 15"
//


舊的語法利用"+"來串接字串,但當要串接的字比較長時會變得不直觀,而新的語法不需要做串接的動作,要記得的是"${}"是變數的意思,看起來相當簡潔直觀,不過要注意字串要用 ` 來括,而非 ' ,當然有要注意這是 ES6 的語法, JavaScript 的版本太低是無法使用的。


參考資料

[ developer.mozilla.org ] 樣板字面值

2021年1月5日 星期二

輕量級繪圖的工具網站

 輕量級繪圖的工具網站

前言

  寫文章時常常需要圖片說明,但要使用小畫家來話又不太方便,比方說箭頭與常見的幾何圖形,這時可以利用今天介紹的工具來製作,是一個線上工具,只要上網就能用。


內容

  這次要就紹的就是 [ www.draw.io ] draw.io ,使用的畫面如下

draw.io 的操作畫面


在圖"1"的地方可以像一般軟體一樣的工具列,這個部分最重要的就是匯出這個功能,等等會說明,圖"2"是工具列,這個工具列可以控制放大縮小與顏色,圖"3"的部分是最常用的部分,有很多的範例圖可以用,如箭頭、矩形...等,只要將圖示拖到中央的工作區就可以了,其他的控制就靠圖"2"的工具列來調整,圖"4"的地方就比較不常用,可以控制紙張的大小與格線的設定。接著說明一下當繪製完成後如何儲存圖片,方法就是匯出,如何匯出?如下圖

匯出的操作


依據上圖操作就可以將繪製的結果儲存成圖片,可以在圖"3"的地方選擇要儲存的格式。


參考資料

[ www.draw.io ] draw.io