首页 > 解决方案 > Object.call() 和 Object.__proto__.call() 有什么区别?

问题描述

Object 没有自己的方法调用,所以它从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
);

标签: javascriptobjectcall

解决方案


Object.callFunction.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调用上下文为ObjectFunction.prototype.call用于确定需要调用哪个函数。

所以

Object.call(null,2)

基本上是一样的

Object(2);

它为您提供了number一个对象包装器的内部。

相反,使用Object.__proto__.call,您正在Function.prototype.call使用 的调用上下文进行调用Object.__proto__。但是Object.__proto__Function.prototypeFunction.prototype根据规范

接受任何参数并在调用时返回 undefined。

console.log(Function.prototype());

所以,当.call用它调用时,无论如何,它都会返回undefined(但它不会抛出错误或任何东西,即使你可能认为它应该- 调用Function.prototype实际上没有任何意义)。

以下表达式都在做完全相同的事情:

Object.__proto__.call(null,2) // undefined
Function.prototype.call(null,2) // undefined
Function.prototype(2) // undefined

推荐阅读