更新于9-20
刪除對象的屬性
var obj = {x : 1,y : {z : 1}};
var obj2 = obj.y;
delete obj.x;
"x" in obj; //false
obj.x ;//undefined
delete obj.y ;
obj2.z ; // 1
用delete操作符刪除對象的屬性,注意delete只是切斷屬性值與宿主對象之間的聯系,
并不會銷毀這個屬性指向的對象,所以obj2指向的屬性對象在宿主對象刪除屬性之后還是存在的,因為這個對象還存在引用數。
創建對象
對象創建的三種方式
- var obj = {};
- var obj2= Object.create(OtherObj);
- var obj3 = new Object();
三種的區別:
第一種對象的原型是Object.prototype
第二種可以為obj2指定它的原型,若為null,則obj2不繼承任何原型(包括Object.prototype)
第三種可以自定義構造函數,為構造函數指定prototype,構造函數為Object則原型是Object.prototype
對象的屬性
分兩類:自有屬性和繼承屬性
屬性的特征(包括自有的和繼承的):包含四個特征, 值(value) 、可寫(writable) 、可枚舉(enumerable)、可配置(configurable)
//(存取器屬性為get、set、enumerable、configurable )
不可枚舉不代表不可訪問
可寫表示是否可以設置該屬性的值,可枚舉表示是否可以通過for/in循環枚舉到,可配置表示是否可以刪除或修改該屬性
遍歷/檢索屬性的常用的方法或操作符
for/in
for(var attr in obj){
console.log(attr);
}
遍歷對象的可枚舉的自有屬性和繼承屬性 一般語言核心定義的內置方法不是可枚舉的。如toStringin運算符
判斷對象的自有屬性或者繼承屬性中是否有指定的屬性(和枚舉沒關系) in運算符可以判斷定義在對象中的值為undefined的屬性
var obj = {attr : undefined}; 'attr' in obj // true
"toString" in {} //truehasOwnProperty()
//用來判定指定的屬性是否是對象的自有屬性,對于繼承屬性返回false(和枚舉性沒有關系)
{}.hasOwnProperty("toString"); //faslepropertyIsEnumerable()
//用來判斷是否是自有屬性而且是可枚舉的
Object.prototype.propertyIsEnumerable("toString"); // false 因為toString是不可枚舉的Object.keys(obj2);
//返回一個由obj2的可枚舉的自有屬性名組成的字符串數組
可用來判斷對象是否為空對象
Object.keys(obj).length === 0 ? 'empty' : 'notempty';Object.getOwnPropertyNames(obj2)
// 和keys類似,不過不要求是可枚舉的
給對象添加和繼承的屬性同名的屬性,添加的屬性值會覆蓋繼承的值
存取器屬性 getter和setter
{
xxx : 'sss',
get r(){一些操作 return this.xxx},
set r(value) {一些操作 this.xxx = value}
}
obj.r ; obj.r ="value";
- 其實存取器屬性就相當于兩個‘方法',使用它時不會像調用方法那樣,而是像取我們的普通屬性一樣。一個存取器屬性如果不設置get則對象無法用這個屬性得到一個值,如果不設置set則無法設置某些值。
存取器屬性里的this是指調用它的對象。
修改對象屬性的特性
- Object.getOwnPropertyDescriptor({x : 1},"x");//得到對象自有屬性的屬性描述對象
存取器屬性的屬性描述對象 {get : function(){}, set : undefined, enumerable : true , configurable : true} - Object.defineProperty({}, 'x', {value : 1, writable : true , enumerable : true, configurable : true});
可以為新建屬性定義屬性特征, 也可以修改已有屬性的屬性特性。