【问题标题】:Javascript : Difference between Function and Function. PrototypeJavascript:函数和函数之间的区别。原型
【发布时间】:2019-10-25 13:04:36
【问题描述】:

如果我们创建如下函数:

function Rabbit() {}

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

Rabbit.__proto__ === Function.__proto__

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

【问题讨论】:

    标签: javascript inheritance prototype prototype-chain


    【解决方案1】:

    这个更高的物体是什么?

    这是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 是真的。对于不是通过new Function 创建的函数,例如Rabbit,也是如此。

    【讨论】:

    • 但是为什么要分开保留FunctionFunction.prototype呢?这不能用一个对象来完成吗?
    • 同一个对象是什么意思?函数是一个构造函数,原型是未来实例的__proto__
    • @VSX - Function 是一个构造函数:当你通过new Function 调用它时,它会创建一个新函数。与使用new X 时的所有构造函数一样,新对象的原型取自X.prototype,这就是Function 具有prototype 属性的原因,该属性具有函数通常具有的各种功能。 Function(函数)提供新对象(函数)的初始化,Function.prototype 提供对象的原型(同样,它就像其他构造函数一样)。
    【解决方案2】:

    Rabbit 不应该继承自 Function 对象,因为它是一个函数吗?

    不,因为它是一个常规函数。您以这种方式创建的每个函数实际上都是一个Function 对象实例。见mdn

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

    【讨论】:

    • 那么创建一个像function Rabbit() {} 这样的函数基本上对我们来说是Rabbit = new Function()
    • 是的。但是不要直接调用构造函数(在大多数情况下不是一种好方法)。
    • 但不要直接调用构造函数。你的意思是只用于原生构造函数吧?
    • @VSX - 您可能想调用几个本地构造函数:DateMapSetWeakMapWeakSetInt32Array 和相关的,@ 987654333@, Proxy... 但是有几个(RegExp, Object, Array, 和 Function)最好避免(除非有很好的理由),以支持使用为这些类型提供的文字语法对象。
    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2014-06-24
    • 2014-10-10
    相关资源
    最近更新 更多