Javascript:功能与功能之间的差异。原型

时间:2019-10-25 13:04:36

标签: javascript inheritance prototype prototype-chain

如果我们创建类似这样的函数

function Rabbit() {}

我们看到它继承自Function继承的同一对象,即

Rabbit.__proto__ === Function.__proto__

这个更高的对象是什么?如果我们尝试记录它,则它看起来像:ƒ () { [native code] }Rabbit是否应该从Function对象继承,因为它是一个函数?有人可以解释我错了吗?

2 个答案:

答案 0 :(得分:2)

  

这个更高的对象是什么?

这是Function.prototype所引用的对象,is also a function。在这里,函数可以从{callapplybindnamelength中获取其属性和方法。

对象的原型由Object.prototype引用the object,它负责基本的对象属性和方法,例如hasOwnPropertytoString以及,因为您在示例中使用了__proto__(这是仅用于Web的功能,用于向后兼容;请不要使用它,而应使用Object.getPrototypeOf)。

  

Rabbit是否应该从Function对象继承,因为它是一个函数?

不,这就是Function.prototype的目的。

让我们将Function放在一旁。假设您有:

function Thingy() {
}

let t = new Thingy();

Object.getPrototypeof(t) === Thingy.prototype是正确的,因为当您使用new Thingy时,结果对象将获得Thingy.prototype指向的对象作为其原型。这就是构造函数和原型在JavaScript中的工作方式。

Function是创建函数的构造函数。因此等效为:

let Rabbit = new Function();

Object.getPrototypeOf(Rabbit) === Function.prototype是正确的。对于未通过Rabbit创建的函数,例如new Function,也是如此。

答案 1 :(得分:1)

  

Rabbit不能从Function对象继承,因为它是一个函数吗?

否,因为它是常规函数。用这种方法创建的每个函数实际上都是一个Function对象实例。参见mdn

要使Function成为对象的原型,您需要明确地将其指定为对象的原型,并使用new关键字创建实例。

相关问题