js面向对象编程:如何检测对象类型

时间:2023-01-10 16:59:09

 在js中检测对象类型主要有三种,typeof,instanceof,constructor,这几种都可以检测对象的类型,但又有一定的区别。另外还可以使用jQuery来检测类型



  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的名称,可能为""或者 null
Function.prototype.getName = function() {
    if ("name" in this) return this.name;
    return this.name = this.toString().match(/function\s*([^(]*)\(/)[1];
};

还可以使用jQuery来检测类型,常用的方法如下:

jQuery.isArray(obj)测试对象是否为数组。

jQuery.isFunction(obj) 测试对象是否为函数。

jQuery.isEmptyObject(obj)  jQuery 1.4 中,这个方法既检测对象本身的属性,也检测从原型继承的属性(因此没有使用hasOwnProperty)。

jQuery.isPlainObject(obj) 测试对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的)。

jQuery.isWindow(obj)  测试对象是否是窗口(有可能是Frame)。

jQuery.type(obj)  检测obj的数据类型。

jQuery.isNumeric(value) 确定它的参数是否是一个数字,包含16进制数