如果我们创建类似这样的函数
function Rabbit() {}
我们看到它继承自Function
继承的同一对象,即
Rabbit.__proto__ === Function.__proto__
这个更高的对象是什么?如果我们尝试记录它,则它看起来像:ƒ () { [native code] }
。 Rabbit
是否应该从Function
对象继承,因为它是一个函数?有人可以解释我错了吗?
答案 0 :(得分:2)
这个更高的对象是什么?
这是Function.prototype
所引用的对象,is also a function。在这里,函数可以从{call
,apply
,bind
,name
和length
中获取其属性和方法。
该对象的原型由Object.prototype
引用the object,它负责基本的对象属性和方法,例如hasOwnProperty
和toString
以及,因为您在示例中使用了__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
关键字创建实例。