csbin
2015-03-27 10:23
function fo(){
console.log(this);
console.log(Object.prototype.toString.call(this));
console.log(Object.prototype.toString(this));
}
fo.call("hello");
运行结果:
String { 0="h", 1="e", 2="l", 3="l" ,4="o"}
[object String]
[object Object]
求解释以上的三种结果
fo.call("hello"); 这样用call去调用foo,目的就是修改fo函数内的this。由于使用call/apply时(一般非严格模式下)会进行基本类型到包装类型的转换,所以fo中的this实际上是new String("hello"); 是一个String对象。
function foo(){ console.log(typeof this); // "object" console.log(this.toString()); // "hello" } foo.call("hello");
所以第一个console.log输出String对象。
第二个在第一章数据类型章节讲过,通过Object.prototype.toString.apply/call可以间接拿到对象的内部[[class]]标签,对于String对象会返回[object String]
而直接调用Object.prototype.toString会返回[object Object],是因为如此调用内部this指向的是Object.prototype。
类似于:
var obj = {x : 1}; obj.toString(); // [object Object]
需了解Object.prototype是一个对象,它作为Object实例的对象的原型。
Object.prototype.toString.call(this) :
a.call(b); 是将a对象的方法运用到b对象上,fo.call("hello") 是改变当前this对象的的指向,调用fo.call("hello")传入的是一个String,Object.prototype.toString.call(this) 是将toString方法运用于this对象,而此时对象为String,多以输出[object String]
Object.prototype.toString(this) :
并没有改变this对象的指向,
每一个object都有toString()方法 并且是被自动调用的,如果不被重写 将会 returns "[object type]" var o = new Object();
o.toString(); // returns [object Object]
个人想法 也有点模糊,希望其他大神给予清晰正确的解释
JavaScript深入浅出
281111 学习 · 1020 问题
相似问题