DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> JS 對象屬性相關(檢查屬性、枚舉屬性等)
JS 對象屬性相關(檢查屬性、枚舉屬性等)
編輯:關於JavaScript     

1.刪除屬性

delete運算符可以刪除對象的屬性

復制代碼 代碼如下:
delete person.age //即person不再有屬性age
delete person['age'] //或者這樣

delete只是斷開屬性和宿主對象的聯系,而不會去操作屬性中的屬性 看到delete a.p之後b.x仍然為1

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); //1

delete只能刪除自有屬性,不能刪除繼承屬性(要刪除繼承屬性必須從定義這個屬性的原型對象上刪除它,當然,這會影響到所有繼承來自這個原型的對象)

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
比如

delete Object.prototype; // 不能刪除 不可配置

var x = 1;
delete this.x; //不能刪除
this.y = 1;
delete y; //這樣可以刪除

function f(){ }
delete this.f; //不能刪除

2.檢測屬性

使用 “in"

in 運算符希望它的左操作數是一個字符串或者可以轉換為字符串,希望它的右操作數是一個對象

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() --- 後者是前者的增強
顧明思議

var obj = {x:1};
console.log(obj.hasOwnProperty("x")); //true
console.log(obj.hasOwnProperty("y")); //false
console.log(obj.hasOwnProperty("toString")); //false 因為obj繼承了這個方法,但不是它自己的

只有檢測到是自由屬性並是可枚舉的屬性時,後者才返回true

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就是不可枚舉的

當然,也可以直接用 ”!=="運算符判斷

var obj = {x:1};
console.log(obj.x !== undefined);//true
console.log(obj.y !== undefined);//false
console.log(obj.toString !== undefined); //true 

3.枚舉屬性

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()方法

var p = {x:1}; //p原型對象繼承自Object.prototype
var o = Object.create(p); //o對象繼承自p

console.log(p.isPrototypeOf(o));//true
console.log(Object.prototype.isPrototypeOf(o));//true
console.log(Object.prototype.isPrototypeOf(p));//true

當然,isPrototypeOf()方法和instanceof運算符非常類似
instanceof運算符希望它的左操作數是一個對象,右操作數標識對象的類。如果左側的對象是右側類的實例,則表達式返回true,否則返回false

var p = {x:1}; 
console.log(p instanceof Object);//true

var d = new Date();
console.log(d instanceof Date);//true
console.log(d instanceof Object);//true
console.log(d instanceof Number);//false

拓展2:

對象的類屬性是一個字符串,用以表示對象的類型信息

一般調用toString()方法後返回形如 [object class]的形式

比如

復制代碼 代碼如下:
var obj = {x:1,y:2};
console.log(obj.toString());//[object Object]

所以要想獲取對象的類,就可以通過返回的字符串中找出 “class"字段  使用 slice(8,-1)
比如

function classOf(obj){ // 找出類名
 if(obj === null){
  return "Null";
 }
 if(obj === undefined){
  return "Undefined";
 }
 return Object.prototype.toString.call(obj).slice(8,-1);
}

console.log(classOf(1)); //Number
//注意,實際上是這些類型的變量調用toString()方法,而不是通過他們自身直接調用
//console.log(1.toString()); //會報錯
var a = 1;
console.log(Number(1).toString()); //1
console.log(a.toString()); //1
console.log({x:1}.toString()); //[object Object]

console.log(classOf(1)); //Number
console.log(classOf("")); //String
console.log(classOf("str")); //String
console.log(classOf(null)); //Null
console.log(classOf(false)); //Boolean
console.log(classOf({})); //Object
console.log(classOf([])); //Array
console.log(classOf(new Date())); //Date
function f(){}
console.log(classOf(new f())); //Object
XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved