6 對象
6.1 創建對象
6.1.1 對象直接量
var point = { x:1,y:2};
6.1.2 new
var o = new Object();
6.1.3 原型
每一個js對象(除了null)都和另一個對象相關聯
直接量創建的對象通過:Object.prototype 獲取對原型的引用。
new創建的對象的原型和構造函數.prototype。如:new Array(),原型為Array.prototype。但同時也繼承自Object.prototype。(原型鏈)
var a = {};
var b = new Object();
Object.prototype.name = function(){
console.log('my name is a');
};
a.name(); // my name is a
b.name(); // my name is a
6.1.4 object.create()
Object.create(args1, [args2]) 的原型:args1。args2可選
6.2 屬性的查詢和設置
object.property
object["property"] 方括號呃逆必須是一個計算結果為字符串的表達式。
繼承
var u = {r:1};
var c = inherit(u);c繼承屬性r
c.x = 1;c.y = 2;
c.r = 3; c覆蓋繼承來的屬性
console.log(c.r);//1 原型對象沒有修改
6.3 刪除屬性
delete 刪除對象的屬性。只是斷開屬性和宿主對象的聯系,不會操作屬性中的屬性
6.4 檢測屬性
in 、
hasOwnPreperty()、檢測給定的名字是否是對象的自有屬性。
propertyIsEnumerable() 只有對象的自有屬性且可枚舉
!== 判斷一個屬性是否是undefined,區分null和undefinend.
6.5 枚舉屬性
for/in可以在循環體中遍歷對象中所有可枚舉的屬性(自有和繼承屬性),把屬性名賦值給循環變量。
對象繼承內部屬性不可枚舉,添加的屬性可枚舉。
ES5 兩個枚舉屬性的方法
Object.keys() //返回數組
Object.getOwnPropertyNames() //返回數組,
6.6 屬性getter 和setter
getter 和setter 屬于存取器屬性,不具有可寫性
數據屬性只有一個簡單的值
var o = {
//數據屬性
name: 'smy',
sex: '女',
//存取器屬性
set operationSex (_sex) {
this.sex = _sex;
},
get operationSex () {
return this.sex;
}
}
console.log(o.sex);
console.log(o.operationSex);
o.operationSex = 'dhr';
console.log(o.sex);
6.7 屬性的特性
一個屬性包含一個值和四個特性
數據屬性:值value, 可寫性writable,可枚舉 enumerable, 可配置configurable
存取器屬性:讀取get, 寫入set, 可枚舉enumerable, 可配置configurale
查看某個對象特定屬性值
Object.getOwnPropertyDescriptor(obj, attr);
Object.getOwnPropertyDescriptor({x: 1,"x"}); //Object {value:1, writable: true, enumerable: true, configurable: true}
修改一個屬性
Object.defineProperty(obj, attr, {})
同時修改多個屬性
Object.defineProperties(obj, { attr1: {}, attr2: {} });
6.8 對象的三個屬性
原型屬性
isPrototypeOf()檢測一個對象是否是另一個對象的原型 與instanceof 相似
類屬性
classof
可擴展性
Object.esExtensible(obj) //判斷該對象是否可擴展
Object.preventExtensions(obj) //轉換為不可擴展 轉換不可逆
6.9 序列化
JSON.stringify()、JSON.parse() 用來序列化和還原js對象。
6.10 對象方法
toString()
toLocaleString()
toJSON()
valueOf()