Javascript 不可不知的祕密 -- Class 與 面向對象

1.類對象的建立方式

  • new 關鍵字,經過調用 constructor()方法來建立對象
  • {} 直接賦值,這種格式中,最後一個屬性後面若是有逗號,對於ES5是忽略的,大部分的ES3也是忽略的,IE中會報錯(贊一個)
  • Object.create(), es5

2. 類的屬性

  • 屬性特性
    • 可寫(writable) : 能夠設置,修改屬性的數值
    • 可枚舉(enumerable) : 能夠經過 for/in 循環 返回該屬性
    • 可配置(configurable) : 能夠修改,刪除屬性自己的特性
  • 類對象的特性
    • 對象的原型prototype : 指向另一個對象,本對象的屬性繼承自原型對象
    • 對象的類 class : 標誌對象類型的字符串
    • 對象可擴展標記 extensible flag : 指明是否能夠爲對象添加新的屬性(es5規範)
  • 對象類別、屬性類別
    • 內置對象 (native object) 都是 ECMAScript規定的類,如Array,Function,Date,RegExp
    • 宿主對象(host object) , 是由 JS 解釋器嵌入的宿主環境,好比瀏覽器定義的一些列DOM對象
    • 自定義對象(user-defined object) 是由 js代碼建立的對象
    • 自有屬性 (own property) 是直接在對象中定義的屬性
    • 繼承屬性 (inherited property)實在對象的原型對象中定義的屬性。

2.繼承 與 prototype 原型

  • 什麼是prototype瀏覽器

    • 每一個Javascript類在定義的時候,會關聯(繼承) 另一個對象(prototype),每一個該類的對象在建立的時候,會從這個對象上來繼承屬性,這個對象就是prototype。
  • prototype 的一些特性函數

    • 經過關鍵字 new 和 構造函數建立對象的原型,就是構造函數的prototype所引用的對象this

    • 全部經過JSON 直接量建立的對象共用同一個原型對象,且經過Object.prototype 能夠獲取到原型對象es5

    • 使用 new Object() 建立的對象的原型也是 Object.prototypeprototype

    • Object.prototype 對象沒有本身的原型對象,其餘的對象都直接或者間接的繼承自Object.prototype 對象code

    • prototype 也是一個對象,prototype 也具備本身的 prototype對象,全部的prototype 對象串聯起來,造成一個能夠訪問到的做用域鏈,叫作原型鏈,原型鏈的結尾是Object.prototype對象

4. 屬性的訪問

  • 屬性的getter,setter - 具備 getter,setter 的屬性 是 accessor property; 普通的屬性是 d> 這裏輸入引用文本ata property;
    • 經過 this.someAccessorProperty 訪問 或者 賦值某個accessor property, 實際上調用的是對應的 getter,setter 方法
    • 只具有getter 屬於只讀屬性;只具有setter屬於只寫屬性,訪問屬性的數值返回undefined;同時具有setter,getter屬於讀寫屬性;二者都不具有屬於普通屬性
    • getter,setter 屬於ES5 標準
    • getter,setter 的定義方法 : var obj = { x1:1, x2:2, get scale(){ return x2/x1; }, set scale(s){ this.x2 = x1 * s; } };
    • gettter, setter 屬性的訪問同正常屬性,用 obj.prop 或者 obj['prop']
  • 屬性的訪問
    • 屬性的描述信息:
      • 屬性的可配置 configurable
      • 屬性的可枚舉 enumerable
      • 屬性的可寫 writable (accessor property 由 setter 決定)
      • 屬性的值 value (accessor property 由 getter 決定)
    • ES5中對於屬性描述信息(屬性特性)的API:
      • Object.getOwnPropertyDescriptor(obj,prop) : 返回 {value:obj,writable:boolean,enumerable:boolean,configurable:boolean} --> 普通屬性; {value:getterFunction,writable:setterFunction,enumerable:boolean,configurable:boolean} --> accessor property
      • Object.getPrototypeOf(obj) : 返回obj 的原型函數
      • Object.defineProperty(obj,prop,descriptor),例如Object.defineProperty({},'id',{value :1,writable:true,enumerable:true,configurable:true});
      • Object.defineProperties(obj,descriptorObj),Object.defineProperties({},{x:{value:1,writable:false,enumerable:true,configurable:false},y:{value:1,writable:false,enumerable:true,configurable:false}});
    • 對象特性對屬性的影響:
      • extensible: 對象的可擴展性決定可否爲對象添加新的屬性
    • 屬性的訪問規則:
      • 若是對象不可擴展,不能添加新屬性
      • 若是屬性不可配置,不可經過defineProperty,defineProperties來修改屬性描述符;若是是accessor property,不可更改setter,setter;若是是 data property,不能將可寫性 由false改成true,但能夠由true改成false;不可進行accessor property ,data property 之間的互轉
      • 若是data property不可寫,不可配置,那麼不能修改它的值;若是隻是不可寫,可是能夠配置,能夠經過 defineProperty 來修改value的值
    • getter,setter,與舊式 API
      • _lookupGetter_()
      • _lookupSetter_()
      • _defineGetter_()
      • _defineSetter_()

5. 對象相關

  • 對象的特性
    • prototype
    • class 屬性: 只能經過默認的 Object.toString() 方法來獲取並截取字符串得到;對於重寫了toString() 方法的類,須要間接調用Object.toString() 方法獲取: Object.prototype.toString.call(obj).slice(8,-1);
    • extensible
      • Object.isExtensible()
      • Object.preventExtensions()
      • 一旦將對象轉換爲不可擴展的,就不能再更改了
      • 對象的封閉 : Object.seal()
      • 對象的凍結: Object.freeze()
  • _proto_
    • Mozilla 早期暴露出的 對象原型的引用方式,目前,IE,Opera不支持,具備兼容問題,支持ES5 的可使用 Object.getPrototypeOf(), 或者 對象的 constructor 的屬性來對應檢測對象的原型函數

6. 對象的重寫方法

  • toString()
  • toLocalString()
  • valueOf() : 執行類型轉化的時候會用到
  • toJSON(): JSON.stringfy() 方法會調用
相關文章
相關標籤/搜索