【问题标题】:What's the difference Object.call() and Object.__proto__.call()?Object.call() 和 Object.__proto__.call() 有什么区别?
【发布时间】:2019-12-10 04:36:52
【问题描述】:
对象没有自己的方法调用,所以从proto中获取,但是为什么结果不一样呢?
// Look at results in your browser's console
console.log(
Object.call(null,2), // Number {2}
Object.__proto__.call(null,2), // undefined
Object.call(null,''), // String {""}
Object.__proto__.call(null,'') // undefined
);
【问题讨论】:
标签:
javascript
object
call
【解决方案1】:
Object.call 是对Function.prototype.call 的引用(因为Object.__proto__ 是Function.prototype):
console.log(Object.call === Function.prototype.call);
console.log(Object.__proto__.call === Function.prototype.call);
console.log(Object.__proto__ === Function.prototype);
Object 是一个构造函数(例如,new Object(...) 给你一个对象)。调用Object.call 会导致调用Function.prototype.call,调用上下文为Object,Function.prototype.call 使用它来确定需要调用哪个函数。
所以
Object.call(null,2)
和
基本一样
Object(2);
在对象包装器中为您提供number。
相比之下,使用Object.__proto__.call,您调用Function.prototype.call,调用上下文为Object.__proto__。但是Object.__proto__ 是Function.prototype。 Function.prototype,per the specification:
接受任何参数并在调用时返回 undefined。
console.log(Function.prototype());
所以,当用它调用.call 时,无论如何,它只会返回undefined(但它不会抛出错误或任何东西,即使你可能认为它应该 em> - 调用 Function.prototype 并没有任何意义)。
以下表达式都在做完全相同的事情:
Object.__proto__.call(null,2) // undefined
Function.prototype.call(null,2) // undefined
Function.prototype(2) // undefined