Object.prototype.toString研究

使用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是一样的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值