【问题标题】:Function.prototype.__proto__ → Object.prototypeFunction.prototype.__proto__ → Object.prototype
【发布时间】:2014-05-24 22:31:59
【问题描述】:

console.log(Function.prototype.__proto__); //Object {}
为什么不Object.prototype?
KFzI3

【问题讨论】:

  • “为什么不是 Object.prototype”是什么意思?这甚至没有意义。
  • typeof(Object.prototype) -> "object",那么结论从何而来?请务必花时间清楚地解释问题 - 使用更多词语。
  • 在哪个浏览器/用户代理/主机中?控制台的行为没有标准。
  • 因为这就是控制台显示具有不可枚举属性的对象的方式。找出有关值的更好方法是使用console.dir

标签: javascript prototype


【解决方案1】:

正是 Object.prototype。

试试这个:

alert(Function.prototype.__proto__ === Object.prototype);

【讨论】:

  • 或者直接阅读ECMA-262 15.3.4:“Function原型对象的[[Prototype]]内部属性的值是标准的内置Object原型对象”。 :-)
【解决方案2】:

您可以在开发工具中查看这一点。转到源选项卡并在 Watch Expressions 部分下。观看Function,您将看到原型链的分解。 More about it on MDN.

【讨论】:

  • @user2864740 你能解释一下吗?
  • 虽然 ECMAScript 确实指定了 Function 对象的原型,它提供了 call/apply 等方法,但这并不能使函数对象成为函数对象。在可以修改非标准/已弃用的__proto__ 的浏览器实现中,请考虑:function x () {}; x.__proto__ = {}; 在此之后,x() 仍然有效(函数应用运算符不使用原型),而 x.call() 无效,@987654329 @ 仍会报告“功能”。
  • @user2864740 — 什么“使 Function 对象成为 Function 对象”可以说是 ECMA-262 13.2(对于本机函数)中的所有内容,或者仅此而已它实现了一个内部 [[Call]] 方法(例如,可调用的宿主方法,如 getElementById)。
【解决方案3】:

为什么不Object.prototype

因为对象没有“名称”,并且控制台不知道您刚刚记录的对象是(或可以)称为Object.prototype 的对象。

相反,它只看到没有可枚举的属性 ({}),并且它有一个 .constructor 属性,它引用了一个函数,其 .name 是字符串 Object

【讨论】:

    猜你喜欢
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多