JavaScript對象之對象標籤和對象序列化

對象標籤有三種:proto、class和extensible。前端

1、proto標籤app

例如我新建了一個person對象,那麼其__proto__則指向Person.prototype,而後Person.prototype的__proto__則指向Object.prototype,Object.prototype的__proto__則指向null,從而造成完整的原型鏈。學習

2、class標籤this

上圖的要點爲:prototype

1. Object.prototype.toString.call(o)則是至關於o.toString(),o做爲this傳入,跟apply的用法很像。3d

2.slice(8,-1)便是截出第8個字符到最後一個字符(不包括最後一個字符)的字符串,旨在截出[object Xxx]中的Xxx。對象

3.typeof new Number(1)返回object,可是使用toString返回的是Number,toString更爲精準一些。(typeof null返回object,而toString則返回null。)blog

3、extensible標籤原型鏈

 

上圖的要點爲:字符串

1.用isExtensible判斷是否可擴展屬性,用preventExtensions來阻止擴展,此時原對象屬性的屬性標籤不受影響。

2.用isSealed判斷是否被封印,用seal來封印對象,此時原對象的屬性標籤變成不可配置了。

3.用isFrozen判斷是否被凍結,用freeze來凍結對象,此時原對象的屬性標籤變成不可寫且不可配置了。

4.以上三種操做對屬性標籤的影響程度一步步地加深,可是對對象的操做不會影響其原型鏈(prototype chain)前端部分的狀況。

 

接下來咱們學習下對象序列化。

 

上圖的要點爲:

1.把對象變爲字符串的過程稱爲對象序列化,序列化後對象的key會加上雙引號,對象的花括號先後都會加上雙引號。

2.若對象屬性爲undefined,則序列化後屬性便去掉了。若屬性值爲NaN或Infinity(無窮),則序列化後屬性會變爲null。若屬性值爲Date對象,則序列化後會變爲UTC格式。

 

上圖的要點爲:對象內部加上toJSON方法,從而自定義序列化過程。

 

上圖的要點爲:

1.obj.toString()可直接輸出[object Object]字符串,至關於Object.prototype.toString.apply/call(obj)。

2.可在對象內部重寫toString和valueOf方法。

3.+obj首先會調用valueOf,看可否變成非對象,若不能,則調用toString,若仍不能轉成非對象,則報錯。

相關文章
相關標籤/搜索