使用Object.prototype.toString方法判断function是否为方法。
比如:
function f(){}
console.log(Object.prototype.toString.call(f);
以上代码则会打印:
[Object Funtion]
之所以不用:f.toString(),是因为后者会重写对应的toString方法,实际上大多数js对象都会重写该方法,比如,方法本身的toString方法重写后则直接输出方法内容本身。
function fn(){
console.log("我是一个方法");
}
console.log(fn.toString());
输出内容为:
function fn(){
console.log(“我是一个方法”);
}
可见,function的内置重写多么体贴,直接把方法内容全部输出了。
所以,为了防止被内置重写方法覆盖,这里使用Object的原生toString方法,这样可以获取一个对象是什么类型。调用Object.prototype.toString.call(thisArgs)函数,参数thisArgs传入我们要判断的对象,比如传入一个function的名字或者一个对象都可以。
例如下面代码:
function Dog(name){
this.name=name;
}
const dog1 = new Dog('Gabby');
Dog.prototype.toString = function dogToString() {
return this.name;
}
console.log(dog1.toString());
console.log(Dog.toString());
console.log(Object.prototype.toString.call(Dog));
console.log(Object.prototype.toString.call(dog1));
输出:
“Gabby”
“function Dog(name) {
this.name = name;
}”
“[object Function]”
“[object Object]”
结果表明,Dog是方法,dog1是对象,而由于在Dog这个对象的定义中重写了toString方法,让它返回该对象的name属性,所以调用dog1的toString方法输出的是Gabby。
如果将Dog的toString重写方法修改一下:
Dog.prototype.toString = function dogToString() {
return "[object "+ typeof this +"]";;
}
这里输出的就是:
[“object Object”]
和console.log(Object.prototype.toString.call(dog1))的输出效果一样的,所以猜测Object的toString方法应该是这样的。
为了验证这种猜想,编辑如下代码:
console.log(Object.prototype.toString.toString());
因为上文不是讲过可以使用function的重写toString方法打印出方法内容吗,我们这就使用它企图一窥原貌验证猜想是否正确。
然而输出却泼一盆冷水:
“function toString() { [native code] }”
看来是我想太多,已经封装起来不给你看,所以先保留这种猜想吧,至少从输出来看是一致的。
另外通过实验,发现typeof(f)和typeof f是一样的效果。