【问题标题】:Why functions prototype is chained repeatedly?为什么函数原型被重复链接?
【发布时间】:2019-02-02 01:08:28
【问题描述】:

我对 JavaScript 很陌生。我正在阅读 JavaScript 的优秀部分。它说:

每个函数对象也是用 prototype 属性创建的

所以我做了这样的事情:

function test() {
}

console.log(test.prototype);

使用 Chrome 的开发者工具,我发现输出如下:

我真的对这个输出感到困惑。为什么constructorprototype 属性再次与constructor 嵌套?为什么这会像 chain 一样进行?我在哪里错过了这个概念?

提前致谢。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    函数的prototype 属性保存使用new 运算符创建时该函数的所有实例都将从其继承的对象。并且所有这些原型对象(通常)都有一个constructor 属性,它指向函数 - 你有循环引用。因此,当 new test() 继承该属性时,(new test).constructor === test 的计算结果为 true

    您需要区分函数对象的 prototype 属性和对象继承的原型对象 - 通常称为“内部 [[prototype]] 属性”。

    构造函数是一个函数,更不用说Function,并且两者都有。因此它继承自Function.prototype 对象——constructor 属性表示所有函数都由Function 构造函数构造。如果您的开发人员控制台会显示 Function 对象的原型,您可以看到它们。我认为设置中有一个选项。

    因此,著名的“原型链”不是关于 constructor 和/或 prototype 属性,而是关于该对象继承自的原型对象:

     function test() {}              new test()
       (a Function)              (a test instance)
            ||                           ||
            ||                           ||
            \/                           \/
     Function.prototype            test.prototype
    (a Function, by spec)           (an Object)
            ||                           ||
            ||                           ||
            \/                           \/
     Object.prototype             Object.prototype
            ||                           ||
            ||                           ||
            \/                           \/
           null                         null
    

    【讨论】:

    • 感谢您的链接,我已经想知道在控制台中快速检查Object.getPrototypeOf(test) 时的输出...
    • 不错的答案..从你的答案中可以得到很多东西:)
    • @Bergi- 请解释一下-“构造函数是一个函数,而不是一个函数,并且两者都有。因此它继承自 Function.prototype 对象”
    • @jason:“构造函数”既是 a)具有 .prototype 属性的构造函数,又是 b)从原型继承属性的对象 - 更具体地说是 Function 实例。
    【解决方案2】:

    这是一本非常好的书。

    它从程序员的角度涵盖了更多的 javascript,涵盖了所有面向对象的技术,并且其中的大部分内容在任何其他关于 javascript 的书籍中都没有涵盖。

    关于原型。 JavaScript 中的每个对象都拥有一个隐藏的状态——对另一个对象的引用,称为对象的原型。 JavaScript 中的原型对象为我们提供了继承,它们也允许我们共享方法实现。原型也连锁。换句话说,既然原型对象只是一个对象,那么一个原型对象可以维护对另一个原型对象的引用。

    Javascript 中的原型是我在学习它时所体验到的一点复杂的部分。

    这是一个很棒的reference,知道 js 中的原型是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2011-05-18
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      相关资源
      最近更新 更多