我们知道,javascript不像java,c++这样的强类型语言一样,都能通过class
关键字来定义一个类,在javascript中,对象的类其实是通过函数来表达的,但需要注意的是,构造函数只是类的公共标识,原型才是类的唯一标识,下面简要说明一下,在javascript中的几种判断对象类型的方法。
1、instanceof判断
该运算符,左边操作数是一个对象,右操作数是该对象所属的“类”,不过它的判断机制并不是检查左边的对象由哪个构造函数来初始化,而是检查对象继承关系,即对象是继承自哪个对象的原型,如果一个对象的原型继承自另一个函数的原型对象,通过该和另一个函数进行instanceof
运算,得到的结果同样是true
,例如:
function Func(){
}
function Foo(){
}
Func.prototype = Foo.prototype;
var oFunc = new Func();
alert(oFunc instanceof Foo);
上面的代码中,通过Func.prototype = Foo.prototype;
让通过Func函数初始化的对象继承自Foo
的原型后,oFunc instanceof Foo
运算得到的结果为true
!!或者把Func.prototype = Foo.prototype;
改为
var oFoo = new Foo;
也会得到同样的结果。但是,使用这个运算符的缺陷是,没有办法通过对象来获得类名,只能判断对象是否属于指定的类名。
Func.prototype = Object.getPrototypeOf(oFoo);
2、通过contructor属性判断
通过情况下,对象的原型上都会带有一个不可枚举的属性contructor
,这个属性的值是一个函数对象,默认情况下,它的值是初始化这个对象的函数。又因为构造函数是类的公共标识,所以直接的方法是通过这个属性来判断。例如:
function typeAndValue(x){
if(x == null) return '';
switch(x.constructor){
case Number:return 'Number';
case String:return 'String';
case Date:return 'Date';
case RegExp: return 'RegExp';
}
}
不过这种 方法也有一个缺陷,虽然通常情况下,一个对象的原型都会有contructor
属性,但我们有时候可能 会忽略这个属性,例如当我们把一个函数的原型属性指向一个指定的对象时Func.prototype = {}
,通过这种方法来检测就不行了。不过还有一个补救措施即:`Func.prototype = {constructor:Func}
,这样这个属性又可以用了。
3、通过构造函数的名称检测
在一些javascript的实现中,具体 我们可以通过typeof
运算获取基本类型的信息,可以通过 Object.prototype.toString.call()
的方式来获取,还可以通过 函数中非标准的name
属性获取函数的名称。不过这种方式也有一定的不足,就是不一定每个函数都会有函数名,如果一个函数没有名称,那么它的name
属性就是一个空串了。
所以在实际应用中,具体应该使用哪个方式,应根据需求来定。