2023年9月25日 星期一

禁止擴充物件的另一個選擇

 禁止擴充物件的另一個選擇

前言

  在之前的 在 JavaScript 禁止物件擴充 介紹了禁止擴充物件的方法,最近發現還有另一個方法也可以禁止物件擴充,在此把學習的過程做個紀錄。


內容

  這次要透過 Object.seal() 來禁止擴充物件,範例如下

let obj = {
  a : 1,
  b : 2
};
Object.seal(obj);
obj.c = 3;
console.log( obj );
// [object Object] {
//   a: 1,
//   b: 2
// }
delete obj.b;
console.log( obj );
// [object Object] {
//   a: 1,
//   b: 2
// }
obj.b = 42;
console.log( obj );
// [object Object] {
//   a: 1,
//   b: 42
// }


範例開頭就透過 Object.seal()  來禁止物擴充,接著實驗擴充該物件後發現是不可以的,接著測試刪除成員,結果一樣是不行,接著試驗修改成員,結果是可以的! Object.seal() 與 Object.preventExtensions() 最大的不同是 Object.seal() 是"不可"刪除成員,但 Object.preventExtensions() 是可以的。


參考資料

[ blog.boggy.tw ] 搞懂 JavaScript的Object.freeze, Object.seal, Object.preventExtensions 到底在幹嘛


相關文章與資料

在 JavaScript 禁止物件擴充

關於 Object.preventExtensions() 的注意事項

2023年9月18日 星期一

在重灌 Windows 時如何分割 2T 以上的磁碟

 在重灌 Windows 時如何分割 2T 以上的磁碟

前言

  最近因為主硬碟掛了,所以買了個 6T 的硬碟來重灌,但重灌時卡在磁碟分割,分割後硬碟的容量只剩 2T ,在此把解決問題的過程做個紀錄。


內容

  在分割程式分割後只剩 2T ,而且不能夠刪除!這時按下 Shift+F10 ,這時會跑出 console ,並在 console 下輸入

diskpart


接著輸入

list disk


其實 diskpart 就是 Windows 磁碟分割的程式,接著可以透過以下確認被割壞的硬碟的號碼

接著透過以下命令

select disk (被割壞的磁碟號碼)
clean all


接著回到 Windows 的分割程式,有個重整的按鈕,按下後就可以看到磁碟回復到未分割的狀態,這樣只是把割壞的硬碟變回正常的狀態,還是無法正常分割。


  查了一下發現是 Windows 有分用 MBR 與 UEFI 兩種開機,一般不選就是用 MBR 的方式,但這個方法會發生無法分割 2T 以上的硬碟的問題,所以要換成用 UEFI 的方式開機,在用 UEFI  開機時要先確認一些 BIOS 的設定,可以參考以下


我這邊對了一下,我需要開啟的只有 Intel PXE Option ROM,這個其實我並沒有確認必要性,因為我的情況是用 CD-ROM 來開機,而不是隨身碟,接著是我卡最久的地方,就是把設定的射完後,再把 CD-ROM (我的情況是 CD-ROM 會提供兩種開機讓我選,其中有一個開頭有 "(UEFI)" )設為最優先開機,結果不行!最後發現要直接在 BIOS 調整順序那,直接"雙擊"你要開機的選項,結果神奇的事情發生了! Windows 可以正常分割 2T 的硬碟,也就是成功用 UEFI 來開機,之前把 UEFI 光碟開機選項調成第一後跳出 BIOS ,無論如何都會用 MBR 來開,這是 Bug 嗎?我不確定 ,這坑沒踩得一定不會知道,就當上了一課。


參考資料

[ learn.microsoft.com ] 安裝 Windows 期間,在大於 2.2 TB 的磁片磁碟機上建立單一磁碟分割時,發生錯誤

[ tw.easeus.com ] Diskpart 是什麼

[ ofeyhong.pixnet.net ] 【教學】搞懂硬碟分割:舊版BIOS/MBR 與 新版UEFI/GPT 有什麼差別?

2023年9月11日 星期一

關於 Object.preventExtensions() 的注意事項

 關於 Object.preventExtensions() 的注意事項

前言

  在先前的 在 JavaScript 禁止物件擴充 有使用到 Object.preventExtensions() ,但實際使用後發現還有些要注意的事項,在此把學習的過程做個紀錄。


內容

  範例如下

let obj = {
  num : 10
};
console.log( Object.isExtensible(obj) );//true
obj.a = 10;
console.log( obj.a );//10
//
Object.preventExtensions( obj );
console.log( Object.isExtensible(obj) );//false
//
console.log( obj );
// [object Object] {
//   a: 10,
//   num: 10
// }
//
delete obj.a;
console.log( obj );
// [object Object] {
//   num: 10
// }
//follow has error...
//Object.defineProperty( obj , 'prop' ,{ value:10 } );


範例開頭新增 a 這個 Property ,接著透過 Object.preventExtensions() 來禁止擴充,接著就是要住的事,雖然是禁止擴充,但是可以刪除!範例刪除 a 是可以的,最後順帶一提, 進止擴充後來自定義 Property 都會禁止,若喚起 Object.defineProperty() 會報錯。


參考資料

[ developer.mozilla.org ] Object.preventExtensions()


相關文章與資料

在 JavaScript 禁止物件擴充

2023年9月4日 星期一

關於自定義 Property 的 enumerable

 關於自定義 Property 的 enumerable

前言

  自定義 Property 可以設定 enumerable ,這功能是做什麼用的呢?在此把學習的過程做個紀錄。


內容

  範例如下

let obj = {
  a : 10,
  b : 20,
};
Object.defineProperty( obj , 'prop1' ,{
  value : 42,
  writable:true,
} );
Object.defineProperty( obj , 'prop2' ,{
  value : 99,
  writable:true,
  enumerable:true,
} );
//
console.log( Object.keys(obj) );//["a", "b", "prop2"]
console.log( Object.getOwnPropertyNames(obj) );//["a", "b", "prop1", "prop2"]


 enumerable 的功能是否可已被"列舉",但如果你總是透過 Object.getOwnPropertyNames() 來列舉的話,你會發現沒有作用,但如果透過 Object.keys() 來列舉的話就可以發現差別,範例的 prop1 在 Object.keys() 不會被列舉出來,所以 enumerable 設定的是會不會被 Object.keys() 列舉出來,順帶一提, Object.keys()  和 for ... in 的結果是一樣的。


參考資料

[ developer.mozilla.org ] Object.defineProperty()


相關文章與資料

檢查是否為自定義的 Property