一、js中的内置对象可以根据他们的class属性来区分彼此,实现方式如下:
const classof=(o)=>{
if(o===null)return "Null";
if(o===undefined)return "Undefined";
return Object.prototype.toString.call(0).slice(8,-1).;
}
二、由于实例对象的class属性都是Object,因此上一中方法检测实例对象失效。可以考虑用instanceof运算符、constructor属性、以及构造函数的名字来检测任意对象的类。
1、如果o继承自c.prototype则:o.instanceof(c)返回true。
2、不使用构造函数作为中介检测原型链上是否存在某个特定的原型对象:如果c.method是原型对象,通过如下方式检测对象o是否是c的类的成员:c.method.isPrototypeOf(o)。
3、因为构造函数是类的公共标识,所以可以用constructor属性来检测(在多个执行上下文的场景中无法正确检测,而且并不是所有的对象都包含constructor属性):
const type=(o)=>{
if(o==null)return "";
swith(o.constructor){
case Number: //处理原始类型
return "Number: "+o;
break;
case String:
return "String: '"+o+"'";
break;
case Date: //处理内置类型
return "Date: "+o;
break;
case RegExp:
return "RegExp: "+o;
break;
case Complex: //处理自定义类型
return "Complex: "+o;
break;
}
}
4、使用instanceof和coustructor属性来检测对象所属的类都有一个主要问题:在多个执行上下文中存在构造函数的多个副本的时候,检测结果不准确,接下来介绍使用构造函数的名字,而不是构造函数本身作为类标识符。在一些js的实现中,为函数对象提供了一个非标准的属性name,用来表示函数的名称。对于没有这一属性的js来说,可以将函数转换为字符串,然后从中提取函数名。
const getName=()=>{
return this.name|| this.toString().match(/function\s*([^()*]\(/)[1];
};