Javascript中的對象-Object

Object對象的方法

當Object 被做爲工具方法,而不是構造方法時,數組

  • Object(arg):包裝方法,將非對象類型包裝成一個對象函數

  • Object.create(proto[, propertiesObject]):工具

  • Object.getPrototypeOf(obj):性能

Object實例對象的方法

必須區分「構造函數的方法」和「實例對象的方法」。this

  • valueOf():返回當前對象對應的值。雙向綁定

  • toString():返回當前對象對應的字符串形式。
    這個方法頗有用,能夠用於判斷對象類型code

  • toLocalString():返回當前對象對應的本地字符串形式。對象

  • hasOwnProperty():判斷某個屬性是否爲當前對象自身的屬性,仍是繼承自原型對象的屬性。繼承

  • isPrototypeOf():判斷當前對象是否爲另外一個對象的原型。ip

  • propertyIsEnumerable():判斷某個屬性是否可枚舉。

對象的屬性模型

  • Object.getOwnPropertyDescriptor():獲取對象的屬性的精確描述模型

Object.defineProperty()
Object.defineProperties()
這兩個方法有性能損耗,會拖慢執行速度,不宜大量使用。

可枚舉性(enumerable)

若是一個屬性的enumerable爲false,下面三個操做不會取到該屬性。

for..in循環

Object.keys方法
JSON.stringify方法(有時能夠利用這一點,爲對象添加註釋信息。)

所以,enumerable能夠用來設置「祕密」屬性。
遍歷對象屬性方法

  • Object.keys()

  • Object.getOwnPropertyNames()
    通常狀況下,幾乎老是使用Object.keys方法,遍歷數組的屬性。

存取器

var o ={
  $n : 5,
  get next(){return this.$n++ },
  set next(n) {
    if (n >= this.$n) this.$n = n;
    else throw "新的值必須大於當前值";
  }
};

o.next // 5

o.next = 10;
o.next // 10

利用存取器,能夠實現數據對象與DOM對象的雙向綁定。

對象拷貝

對於簡單屬性,就直接拷貝,對於那些經過描述對象設置的屬性,則使用Object.defineProperty方法拷貝。

var extend = function (to, from) {
  var descriptor = Object.getOwnPropertyDescriptor(from, property);

  if (descriptor && ( !descriptor.writable
    || !descriptor.configurable
    || !descriptor.enumerable
    || descriptor.get
    || descriptor.set)) {
    Object.defineProperty(to, property, descriptor);
  } else {
    to[property] = from[property];
  }
}

控制對象狀態

JavaScript提供了三種方法,精確控制一個對象的讀寫狀態,防止對象被改變。最弱一層的保護是preventExtensions,其次是seal,最強的freeze。

不可擴展對象(不能加,可改,可刪)

Object.preventExtensions方法能夠使得一個對象沒法再添加新的屬性。能夠用delete命令刪除它的現有屬性。
判斷: Object.isExtensible(obj);

密封的對象(不能加,刪,可改)

Object.seal方法使得一個對象既沒法添加新屬性,也沒法刪除舊屬性。

判斷: Object.isSealed(obj);

凍結的對象(不能加,不能改,不能刪)

Object.freeze方法能夠使得一個對象沒法添加新屬性、沒法刪除舊屬性、也沒法改變屬性的值,使得這個對象實際上變成了常量。
判斷: Object.isFrozen(obj);

侷限性: 須要注意的是,使用上面這些方法鎖定對象的可寫性,可是依然能夠經過改變該對象的原型對象,來爲它增長屬性。

相關文章
相關標籤/搜索