【问题标题】:Why does Function.__proto__ return something different than other prototypes?为什么 Function.__proto__ 返回的东西与其他原型不同?
【发布时间】:2018-02-18 04:03:48
【问题描述】:

如果您尝试打印出常规对象的__proto__ 属性,例如{}.__proto__foo.__proto__,您会得到[object object];这个[object object] 是另一个对象的原型。但是,如果您尝试打印出任何函数的__proto__ 属性,它会为您提供function () { [native code] }。这是为什么 ?它不应该返回Function 继承自的对象的原型,它应该是一个对象而不是另一个函数(如function(){native code]})?一个函数的__proto__ 怎么可能是另一个函数而不是一个对象,就像其他原型一样?

*我知道应该使用 Object.getPrototypeOf(obj) 来代替 proto,但我使用了它,因为它更短。

如果有人向我解释上述内容,我也将不胜感激。如果您对我的问题有任何困惑,请在 cmets 中提问,而不是投反对票。

【问题讨论】:

  • 如何打印?可能正在进行类型转换...
  • document.write() 在这两种情况下。

标签: javascript prototype


【解决方案1】:

原因

Function.prototype.toString()

将返回

"function (){ [native code] }"

Function.prototype 是一个对象,但是当您打印它时,它会被类型转换为字符串,并且作为原型实现函数的行为:

function(){}.toString() 

即使不是,它也会打印为函数。

function(){}
 .__proto__ // Function.prototype
 .__proto__ // Object.prototype
 .toString() // "[Object object]

也许更可以想象:

class Human {
  toString(){
    return "Im a Human";
  }
}

console.log( 
(new Human).__proto__
);
//the Human.prototype tells you that it is a Human, however its just a class.

【讨论】:

  • 嗯,这是为什么呢?为什么它不像其他人一样返回[object object]?这是什么意思?
  • @taurus 导致 function.prototype 定义了函数的行为。这就是为什么它表现得像一个函数,不像它不是
  • 所以Function.prototype 只是一个函数?你能详细说明一下吗?对不起,但这真的很令人困惑。在完全不同的情况下,Function.__proto__ === Function.prototype 如何评估为 true ?这不是说FunctionFunction 的一个实例吗?
  • @taurus 不是一个对象。是的,每个function(){} instanceof Function
  • 是的,但为什么 Function 本身就是 Function 的实例?这不是说一个孩子是他自己的父亲吗?对我来说,这就像一个悖论。
【解决方案2】:

在 JavaScript 中,使用 var o = new f() 调用构造函数会创建一个新对象,并且 将o.__proto__ 设置为f.Prototype。同:

new Array().__proto__ == Array.prototype // true
new Number().__proto__ == Number.prototype // true

或:

[].__proto__ == Array.prototype // true
(5).__proto__ == Number.prototype // true

Function 是一个构造函数,所以用new Function() 创建一个函数会将其原型设置为Function.prototype

new Function().__proto__ === Function.prototype // true

或:

(function() {}).__proto__ == Function.prototype // true

所有函数都具有相同的原型,包括构造函数。所以:

Function.__proto__ == Function.prototype // true
Array.__proto__ == Function.prototype // true
Number.__proto__ == Function.prototype // true

Function.prototype 定义了函数的默认行为,所有函数都继承自,包括调用它的能力,因此它本身就充当函数:

Function.prototype() // undefined
(new Function())() // undefined

【讨论】:

  • 关于您添加到关于按值和按引用的其他答案的评论,接受的答案基本上证明了大卫弗拉纳根文章中所述的内容。
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2022-01-15
相关资源
最近更新 更多