javascript - 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
);
解决方案
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
,根据规范:
接受任何参数并在调用时返回 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
推荐阅读
- javascript - 使用 javascript/jquery 对 wordpress 插件生成的 UL 的顺序进行排序
- hyperledger-fabric - Hyperledger Fabric:Stub.getState 返回空缓冲区
- java - 在JTable中设置不同颜色的行?
- c# - 在 Web 表单中的自定义配置文件提供程序上从用户获取和设置数据
- meteor - 如何将 Google Cloud Text-to-Speech 与 Meteor 集成
- html - 如何为单个模板中的每个条目分隔输入表单
- apache - 一段时间后应用程序因代理错误而关闭
- image - 无法将图像添加到 tkinter 窗口
- javascript - div中的innerHTML多次插入和自动完成问题
- ios - 如何在 iOS Swift 中获取 m3u8 视频 url 的缩略图?