1.刪除屬性
delete運算符可以刪除對象的屬性
代碼如下:
delete只是斷開屬性和宿主對象的聯系,而不會去操作屬性中的屬性 看到delete a.p之後b.x仍然為1
1 2 3 4 5 6 7 var a = {p:{x:1}}; var b = a.p; console.log(a.p.x); //1 delete a.p; console.log(a.p.x); //TypeError a.p is undefined console.log(a.p); //undefined console.log(b.x); //1delete只能刪除自有屬性,不能刪除繼承屬性(要刪除繼承屬性必須從定義這個屬性的原型對象上刪除它,當然,這會影響到所有繼承來自這個原型的對象)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function inherit(p){ if(p == null){ // 不能從null中繼承 throw TypeError(); } if(Object.create){ //如果有這個方法就直接使用 return Object.create(p); } var t = typeof p; if(t !== "object" || t !== "function"){ //要繼承的對象 類型要符合 throw TypeError(); } function f(){ }; //定義一個空的構造函數 f.prototype = p; //原型指向要繼承的對象p return new f(); //創建f對象,此對象繼承自p } var obj = {x:1}; var obj1 = inherit(obj); obj1.y = 2; console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = 2 delete obj1.x; delete obj1.y; console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = undefined當然了,可配置的屬性才能用到delete
比如
2.檢測屬性
使用 “in"
in 運算符希望它的左操作數是一個字符串或者可以轉換為字符串,希望它的右操作數是一個對象
1 2 3 4 5 6 7 8 9 var data = [5,6,7]; console.log("0" in data); //有下標0 console.log(1 in data); //1可以轉換成"1" console.log("4" in data); //下標只有 1 2 3 var obj = {x:1}; console.log("x" in obj); //true console.log("y" in obj); //false console.log("toString" in obj); //true 因為obj繼承了這個方法使用hasOwnProperty()或者propertyIsEnumerable() --- 後者是前者的增強
顧明思議
只有檢測到是自由屬性並是可枚舉的屬性時,後者才返回true
1 2 3 4 5 var obj = {x:1}; console.log(obj.propertyIsEnumerable("x")); //true console.log(obj.propertyIsEnumerable("y")); //false console.log(obj.propertyIsEnumerable("toString")); //false 因為obj繼承了這個方法,但不是它自己的 console.log(Object.prototype.propertyIsEnumerable("toString")); //false 因為最原始的的 toString就是不可枚舉的當然,也可以直接用 ”!=="運算符判斷
1 2 3 4 var obj = {x:1}; console.log(obj.x !== undefined);//true console.log(obj.y !== undefined);//false console.log(obj.toString !== undefined); //true3.枚舉屬性
1 2 3 4 5 6 var obj = {x:1,y:2}; for(p in obj){ console.log(p);//x y console.log(obj.p);// undefined undefined console.log(obj[p]);//1 2 }拓展1:
每個對象都有與之相關的原型(prototype)、類(class)、可擴展性(extensible)
要檢測一個對象是否是另一個對象的原型(或處於原型鏈中),可以使用isPrototypeOf()方法
當然,isPrototypeOf()方法和instanceof運算符非常類似
instanceof運算符希望它的左操作數是一個對象,右操作數標識對象的類。如果左側的對象是右側類的實例,則表達式返回true,否則返回false
拓展2:
對象的類屬性是一個字符串,用以表示對象的類型信息
一般調用toString()方法後返回形如 [object class]的形式
比如
代碼如下:
所以要想獲取對象的類,就可以通過返回的字符串中找出 “class"字段 使用 slice(8,-1)
比如