为什么使用Object.prototype.toString.call来判断没有问题,但是使用Object.toString.call判断就会报错呢?
按照原型链的原理,当前对象上找不到该方法,不就会自动去原型链上找这个方法吗?写成Object.toString找不到不就会自动向Object.prototype.toString上面找吗?
为什么使用Object.prototype.toString.call来判断没有问题,但是使用Object.toString.call判断就会报错呢?
按照原型链的原理,当前对象上找不到该方法,不就会自动去原型链上找这个方法吗?写成Object.toString找不到不就会自动向Object.prototype.toString上面找吗?
function A() {
}
A.prototype = {
b: function() {
console.log(1)
}
}
console.log(A.b) // undefined
A.prototype.b() // 1
const a = new A();
a.b() // 1
不知道这个例子恰不恰当, 我感觉是只有实例才会自动去原型链查找
看报错信息是Object.toString.call()接受的参数需要是一个函数以便获取到this。
如果是这样的那就不会报错:
那么Object.prototype.toString.call运行是什么结果?
所以我有理由怀疑报错的根源不是找不到toString方法,而是Object.toString方法对于入参类型有要求,同时我猜测Object.toString和Object.prototype.toString可能实现上存在差异。
更深入的部分因为自身水平有限,暂时没法解释。
Object
本身是一个 constructor , javacript 里 contructor 是一个 function object 。
另外注意原型链里基类属性是 __proto__
,而不是 prototype
。prototype
是 constructor 的一个属性,用于赋值给被创建出对象的 __proto__
。也就是说,用 new Object
创建出的新对象的 __proto__
属性会是 Object.prototype
。
由于 Object
是一个 function object ,Object.__proto__ === Function
。
Object
没有自己的 toString()
,所以 Object.toString()
使用 Object.__proto__.toString()
(注意,不是 Object.prototype.toString()
),也就是 Function.toString()
。
所以会有 Object.toString()
与 Object.prototype.toString()
的不同。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答1.5k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
主要
Function.prototype
重写toString
方法, 也就是说它有自己 toString() 方法.先来理解这两句:
再回来看看你的问题, 从上面的结果来看 Object.toString 是不是指向是 Function.prototype.toString
结果正确对, 上面你描述的错误的关键是 Function.prototype 重写 toString()
也可以这么测试,验证是否被重写