iT邦幫忙

0

Object.defineProperty()

const obj = {};

Object.defineProperty(obj, 'prop', {
  value: 11,
  writable: false
});

console.log(obj.prop)   // 11
console.log(obj)        // Object {  }

請問為什麼console.log(obj)不會看到.prop在裡面,但obj.prop又可以看到呢?

2 個回答

2
通靈亡
iT邦研究生 3 級 ‧ 2021-02-15 23:05:56

新年快樂,
方便問一下你是使用哪個瀏覽器?
我使用 Firefox 和 Chrome 輸入你提供的程式碼
Object {...} 點開來之後,有看到.prop在物件裡面。

https://ithelp.ithome.com.tw/upload/images/20210215/20120331fKwVKAoY4w.png

https://ithelp.ithome.com.tw/upload/images/20210215/201203311YZ4MI4mdm.png

看更多先前的回應...收起先前的回應...

hypons iT邦新手 5 級 ‧ 2021-02-16 00:52:54 檢舉

新年快樂

我只是在MDN上看到這句語法,然在下面的demo試了一下而已。

就像這樣
https://ithelp.ithome.com.tw/upload/images/20210216/20119815rzFtl9wUvc.jpg

hypons iT邦新手 5 級 ‧ 2021-02-16 00:53:56 檢舉

所以其實prop是在obj裡面的,只是MDN的demo看不到嗎?

通靈亡 iT邦研究生 3 級 ‧ 2021-02-16 14:21:48 檢舉

因為 Object.defineProperty 的 enumerable 預設值為 false,所以你在非瀏覽器的 console 存取物件是看不到非列舉的屬性。

https://ithelp.ithome.com.tw/upload/images/20210216/20120331lFaB2j0sqW.png

https://ithelp.ithome.com.tw/upload/images/20210216/20120331HKCw5j0jvm.png

要查看物件的所有屬性可以用Object.getOwnPropertyNames(obj)
https://ithelp.ithome.com.tw/upload/images/20210216/20120331YUDGUsTu25.png

0
fillano
iT邦超人 1 級 ‧ 2021-02-16 10:23:17

在node.js環境中看到的是{}

console.log()要印出什麼應該是定義在https://console.spec.whatwg.org/ ...不過沒看到他規定要印出什麼?

看起來console.log(...args)會呼叫Logger('level', ...args),然後在Logger中呼叫Printer,然後要印出什麼,可以選擇的有兩種formatter:

  1. optimally useful formatting
  2. generic JavaScript object formatting

前一種會顯示較多的資訊,但是並沒看到有規定要顯示什麼,也沒有規定要怎樣顯示。底下的node.js實作範例,跑出來的結果也是{}

另外,這樣定義出來的prop是無法列舉的,所以要在客戶端實作console.log()恐怕有一些限制。

我要發表回答

立即登入回答