Javascript中对象类型的判断

我们知道,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属性就是一个空串了。
所以在实际应用中,具体应该使用哪个方式,应根据需求来定。

猜你喜欢

转载自blog.csdn.net/yangkaige111/article/details/81268794