js物件導向編程:如何檢測物件類型
在js中檢測物件類型主要有三種,typeof,instanceof,constructor,這幾種都可以檢測對象的類型,但又有一定的區別。
1使用typeof檢測物件類型。
typeo作為最常用的檢測類型的方法,返回字串類型,具體使用如下:
function testType(value) { var str=typeof(value); // alert(str); switch(str) { case 'undefined': // undefined類型 case 'object' : // null類型,任意內建對象,數組 case 'boolean' : // true,false類型 case 'string' : // string字串類型 case 'function': //任意函數 case 'number': //任意的數實值型別,包含NaN } }
可以看到,對於最基本的類型可以測試出類型,但對於其他的,包括日期,數組等大多都返回object類型,而且null也返回的是object類型,也就是沒有辦法知道確切的類型。
另一種改進的檢測方法,是使用,預設的ToString,繼承自object,可以傳回型別資訊
function classof(o) { if (o === null) return "Null"; if (o === undefined) return "Undefined"; return Object.prototype.toString.call(o).slice(8,-1); } function testType(value) { var str=classof(value);//typeof(value); alert(str); switch(str) { case 'undefined': // undefined類型 case 'object' : // 對象 case 'Boolean' : // true,false類型 case 'String' : // string字串類型case 'Function': //任意函數case 'Number': //任意的數實值型別,包含NaN case 'Date'://日期case 'Array'://數組case 'RegExp'://正則 } }
可以看到改進了一部分,但object類型還是有很大一部分。
2使用instanceof檢測物件類型
對於typeof檢測為object類型的可以使用instanceof進一步檢測具體的類型。instanceof實際上檢測的對象的原型。
可以檢測變數是不是某個對象的執行個體,返回bool值。
例如:
var value=new Date();var isdate= value instanceof Date alert(isdate);
3使用constructor檢測物件類型檢測物件類型
constructor相當於檢測建構函式,返回的是一個函數
例如:
function testconstructor(value) { var str=value.constructor; switch(value.constructor) { case Number: //數實值型別 break; } // alert(str); }
如果需要檢測一個對象的確切類型,可以綜合使用這三種方法
例如:
function type(o) { var t, c, n; // type, class, name // 是null類型: if (o === null) return "null"; // 是數值中的特殊類型: NaN : if (o !== o) return "nan"; // 使用 typeof 檢測除去 "object"類型為的其他類型. if ((t = typeof o) !== "object") return t; // typeof檢測為"object"類型,則進一步檢測 // 可以檢測出大部分內建類型 if ((c = classof(o)) !== "Object") return c; // classof(o)返回為"Object"時,檢測constructor if (o.constructor && typeof o.constructor === "function" && (n = o.constructor.getName())) return n; // 無法識別的其他類型,預設為"Object" return "Object";}function classof(o) { return Object.prototype.toString.call(o).slice(8,-1);}; // 返回function的名稱,可能為""或者 nullFunction.prototype.getName = function() { if ("name" in this) return this.name; return this.name = this.toString().match(/function\s*([^(]*)\(/)[1];};