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

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

时间: 2024-10-11 12:21:24

js面向对象编程:如何检测对象类型的相关文章

JavaScript (JS) 面向对象编程 浅析 (含对象、函数原型链解析)

1. 构造函数原型对象:prototype ① 构造函数独立创建对象,消耗性能 function Person(name) { this.name = name; this.sayHello = function () { console.log("Hello,my name is " + this.name) } } var P1 = new Person("Tom"); var P2 = new Person("Jim"); P1.sayHe

简单粗暴地理解js原型链--js面向对象编程

简单粗暴地理解js原型链--js面向对象编程 原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧,想点与代码无关的事,比如人.妖以及人妖. 1)人是人他妈生的,妖是妖他妈生的.人和妖都是对象实例,而人他妈和妖他妈就是原型.原型也是对象,叫原型对象. 2)人他妈和人他爸啪啪啪能生出一堆人宝宝.妖他妈和妖他爸啪啪啪能生出一堆妖宝宝,啪啪啪就是构造函数,俗

js面向对象编程:this到底代表什么?

在js中this的用法很让人迷惑,有些像Java或者C#中的this,但又不完全一样.按照流行的说法this总是指向调用方法的对象. 1.纯粹函数调用. function ListCommon2(x) { this.x=x; alert("this 是 ListCommon2"+(this instanceof ListCommon2)); alert("this.constructor"+this.constructor); } function test(){

由几道JS笔试题引发的知识点探究十五——JS面向对象编程

JS初学者大都没有认识到其强大的面向对象编程的特性,只是把JS当作一门简单实用的脚本语言来用.也正因如此,JS程序员往往处于程序员鄙视链的最低端,很多人觉得JS是HTML一类的语言,甚至连语言都称不上.事实完全不是如此,你若也有这种想法,说明你对JS的认识太浅薄了.要想正真迈入JS的大门,你必须深入了解JS面向对象编程的特性.下面就让我为大家一一道来. 一.创建对象 既然是面向对象,那肯定先得有对象吧,要有对象,肯定得知道对象是什么吧,那JS中的对象是什么呢?在C++里我们知道,对象就是类或结构

JS面向对象之特性和值类型与复合类型

JS面向对象之特性已经值类型与复合类型 一些属性 空对象 空对象也是对象, 只是有存变量的变量名, 没有对象属性 var o = {}; 参数传递 值类型: 函数内外两个变量, 两个数据, 都不相同 引用类型: 函数内外变量不同, 一个数据, 相同地址 赋值 var num = 123; var num2 = num; 值类型的赋值特点 将变量内的数据全部拷贝一份, 赋值的变量 var num = 123 表示变量中存储中的数字是 123 将 123 数据拷贝一份, 内存中有 2 个数据 将拷贝

js面向对象编程(二) 构造函数继承

构造函数绑定 //基类建筑物var building = function () {    this.spec = "building";}; //address:房子地址,toward:房子朝向var house = function (address, toward) {    this.address = address;    this.toward = toward;}; //使房子继承建筑物 //使用call或者apply方法,将父对象的构造函数绑定在子对象上,在子对象构造

js面向对象编程:this到底代表什么?第二篇

总认为自己弄明白了js中this的含义,this总是指向调用方法的对象,作为方法调用,那么this就是指实例化的对象.但前几天自己写脚本却遇到了一个很奇怪的问题. 代码如下: //内部对象AutoCompleteInner function AutoCompleteInner(transformResultInner) { if(transformResultInner) { this.transformResultInner=transformResultInner; } } AutoComp

js面向对象编程/原型链/继承 —— javascript

目录 js面向对象编程 js原型链 共享方法 原型继承 js面向对象编程 js面向对象编程不同于 java 的类和对象 JavaScript 不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程. js声明的构造函数,类似于普通函数的声明,但又不同, 实例对象时,如果不写new,就是一个普通函数,它返回 undefined. 但是,如果写了new,它就变成了一个构造函数,它绑定的 this 指向新创建的对象, 并默认返回 this,也就是说,不需要在最后写return th

js面向对象编程:如何实现方法重载

js中如何实现方法重载?这涉及到三个问题 1同名函数的调用问题 2函数中特殊的参数arguments 3如何利用arguments实现方法重载 1同名函数的调用问题 都知道在js中如果存在多个名称相同的函数,则调用实际每次都只使用最后一个,js其实是没有重载的,也就是说,如果定义了多个同名的函数,单参数不一样,在调用时,js不管参数个数,只管前后顺序 例如: function test1(arg1) { alert("参数1:"+arg1); } function test1(arg1