js高程物件筆記

vas_wm發表於2019-03-29
1、物件屬性
  • 資料描述符
    • value
    • writable
      • 決定是否可被賦值
  • 儲存描述符
    • get()
    • set()
  • 兩者都有的屬性
    • enumerable
      • 決定是否可被列舉
    • configurable
      • 決定屬性描述符是否可被改變或刪除
2、建立物件的方式
  • 物件直接量
  • 通過new建立物件,var a = new function();
    • 先建立一個 {} ,
    • 然後 {}.proto = function.prototype
    • 然後將 {} 傳給建構函式, 相當於this,執行建構函式
    • 如果建構函式return 有返回,則返回,無則返回這個物件。
  • 原型繼承
    • Object.prototype 的原型為 null,或者說不繼承任屬性。
  • Object.create(proto, propertyObject)
    • 第一個引數為要繼承的物件。

    • 第二個引數為新生成的物件的屬性描述。

    • Object.creat(null) 可建立不繼承任何屬性和方法的物件。

    • inherit方法:

        // 如果不用Object.create()無法實現和Object.create(null) 一樣的效果。原因是new在建立一個物件時,如果建構函式的prototype不是一個物件(null除外),則轉為使用Object.prototype
        function inherit(proto) {
            if (typeof prototy !== function || typeof proto !== 'object'  || proto === null) {
                return;
            }
      
            if (Object.create) {
                return Object.craete(proto);
            }
      
            if (proto === nu;;)
      
            let fn = function () {};
      
            fn.prototype = proto;
      
            return new fn();
        }
      複製程式碼
3、屬性的查詢和設定
  • 如果物件 o 繼承一個只讀屬性x,那麼給 o.x 賦值是不允許的。如果允許屬性賦值操作,也只在 o 本身修改或增加屬性。
  • o 繼承的物件可能是存取描述屬性,這時候給 o 新增屬性,會呼叫 setter。
  • Object.prototype 是隻讀的。
4、刪除屬性
  • delete 刪除物件屬性
5、檢測屬性
  • in運算子:如果物件的自有屬性或繼承屬性中包含這個屬性則返回true,可以區分不存在的屬性和存在但是值為undefined的屬性。
  • Object.prototype.hasOwnProperty() :檢測給定的名子是否是物件的自有屬性。
  • Object.prototype.propertylsEnumerable():只有檢測到是自有屬性錢可列舉才返回true
列舉屬性
  • fon...in 語句迴圈

      for (p in o) {
          if (!o.hasOwnProperty(p)) {
              continue;
          }
      }
    複製程式碼
  • Object.keys()

  • Object.getOwnPropertyNames()

屬性getter和setter
  • 字面量定義get set

     ```
         // 字面量定義get、set
        var p  = {
             x: 1,
             get r () {
                 return this.x;
             },
    
             set r(value) {
                 this.x = value;
             } 
        }
        
        // 利用get set實現自增或自減。
        var generate = {
             n: 10,
             get next() {
             
                 if (this.n < 0) {
                     return 'done'
                 }
         
                 return this.n--;
             } ,
             
             set next(value) {
                 this.n = value
             }
        }
    
     ```
    複製程式碼
屬性的特性
  • Object.getOwnPropertyDescriptor()
  • Object.defineProperty()
  • Object.defineProperties()
物件的三個屬性
  • 原型屬性(prototype)
    • Object.getPropertyOf() 查詢原型
    • p.isPropertyOf(o) 監測 p 是否是 o 的原型或 p 在 o 的原型鏈上。
    • o instanceOf p 判斷 p 是否是 o 的建構函式或 p 是在 o 的原型鏈中存在的建構函式。
  • 類(class)
    • 利用Object.prototype.toString.call( F ) 來判斷 F 的資料型別
    • Object.prototype.toString.call( null ) === '[Object Null]'
    • Object.prototype.toString.call( undefined ) === '[Object Undefiend]'
  • 可擴充套件性(extensible attribute, 都是針對自有屬性):
    • Oject.preventExtensions()
      • 讓一個物件永遠不能新增任何屬性,僅針對自身物件,但是可以修改已有可讀屬性,刪除屬性。
    • Object.seal()
      • 讓一個對不能新增新屬性、不能刪除已有屬性 ,不能修改已有屬性的描述、但是可以修改已有可讀屬性的值。
    • Object.freeze()
      • 最完全,不能新增新屬性、不能刪除已有屬性、不能修改已有屬性的值和描述。
序列化物件
  • JSON.parse(JSON.stringfy(o))

相關文章