1、物件屬性
- 資料描述符
- value
- writable
- 決定是否可被賦值
- 儲存描述符
- get()
- set()
- 兩者都有的屬性
- enumerable
- 決定是否可被列舉
- configurable
- 決定屬性描述符是否可被改變或刪除
- enumerable
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()
- 最完全,不能新增新屬性、不能刪除已有屬性、不能修改已有屬性的值和描述。
- Oject.preventExtensions()
序列化物件
- JSON.parse(JSON.stringfy(o))