對象的三個屬性

每一個對象都有與之相關(guān)的原型、類、可擴展性。這就是對象的三個屬性

原型屬性

對象的原型屬性是是用來繼承屬性的。

類屬性

對象的類屬性是用來表示對象的類型信息的。

如何獲得對象的類??
  1. 可以通過調(diào)用 toString() 方法,會返回這樣格式的字符串 [object class]
  2. 接著提取字符串的第8個到倒數(shù)第二個位置之間的字符。
名稱
  • 通過內(nèi)置構(gòu)造函數(shù)創(chuàng)建的對象,其類屬性與構(gòu)造函數(shù)的名稱相匹配。

  • 宿主對象也有包含其意義的類屬性

  • 通過對象直接量和Object.create創(chuàng)建的對象的類屬性是“Object”

  • 自定義構(gòu)造函數(shù)創(chuàng)建的對象的類屬性也是"Object",因此,對于自定義的類來說,沒辦法通過類屬性來區(qū)分對象的類。但是,可以通過構(gòu)造器的名稱來區(qū)分。

      function classof(o) {
         if(o === null)return "NULL";
         if(o === undefined) return "Undefined";
         return Object.prototype.toString.call(o).slice(8, -1);
     }
     console.log(classof(1));  //Number
     console.log(classof("")); //String
     console.log(classof({})); //Object
     console.log(classof([])); //Array
     console.log(classof(new Date())); //Date
     console.log(classof(window)); //window
     console.log(classof(document)); //HTMLDocument
     function f() {}
     console.log(classof(new f())); //Object
    
     構(gòu)造器名稱的獲取方法:a.constructor.name
    

可擴展性

對象的可擴展性用來表示是否可以給對象添加新屬性

這里涉及到JS對象中有兩種屬性:數(shù)據(jù)屬性和存取器屬性
  • 對象的數(shù)據(jù)屬性的特性包括:value(值), writable(可寫性), enumerable (可枚舉性), configurable(可配置性)一般來說,在新建一個對象屬性時,默認(rèn)情況下的性質(zhì)都是true的。
  • 對象的存取器屬性包括: get(讀取), set(寫入),enumerable(可枚舉性),configurable(可配置性)
屬性不可配置的話就說明,不可以修改其屬性的可配置性和可枚舉性
  • 當(dāng)數(shù)據(jù)屬性是不可配置的時候,就不能將它的可寫性從false改為true, 但可以從true轉(zhuǎn)為false(可以變壞不可以變好)
  • 當(dāng)存取器屬性是不可配置的時候,不能修改其getter和setter方法

所有的內(nèi)置對象和自定義對象都是顯示可擴展的,然后如何來設(shè)置改變這些特性呢??

  • Object.preventExtensions() 將對象設(shè)置為不可擴展,這個時候可以設(shè)置屬性的相關(guān)值,但是不可以添加新的屬性。
  • Object.seal() 將對象對象設(shè)置為不可擴展,同時設(shè)置對象的自有屬性為不可配置。
  • Object.freeze()將對象設(shè)置為不可擴展性,屬性不可配置,并且數(shù)據(jù)屬性為只讀(writable為false),但是如果對象的存取器屬性具有setter方法,存取器屬性將不受影響,仍可以通過屬性賦值調(diào)用他們。

序列化對象

對象序列化是指將對象的狀態(tài)轉(zhuǎn)為字符串,即JSON.stringify()。也可以將字符串還原為對象 JSON.parse()
轉(zhuǎn)為字符串的話我們還會想到另一個方法,toString(), 這個方法將返回一個表示調(diào)用這個方法的對象的字符串

  • NaN, Infinity, -Infinity序列化的結(jié)果是null,

  • 日期對象序列化后的結(jié)果是字符串,但JSON.parse()仍會保留他們的字符串狀態(tài)

  • 函數(shù)、RegExp、Error對象和undefined值不能序列化和還原

  • JSON.stringify()只能序列化對象可枚舉的自有屬性,對于一個不能序列化的屬性來說,在序列化后輸出的結(jié)果會將這個屬性省略掉

      var b = new Date();
      var a =JSON.stringify(b);
      console.log('JSON.stringify: ' + a);
      console.log('toString: ' + a);
      console.log('typeof(JSON.parse(a)): ' + typeof(JSON.parse(a)));
      console.log('typeof(new Date()): ' + typeof(b));
    
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容