为什么原型的构造函数会引用回自身?

丁丁

来自Mozilla-javascript-docs

"每个对象都有一个私有属性,该属性保存到另一个称为其原型的对象的链接。该原型对象有自己的原型,依此类推,直到到达一个以 null 作为原型的对象。根据定义,null 没有原型,并作为这个原型链的最后一环。

第一个问题- 我希望“每个对象都包含原型”,作者的意思是“每个函数对象”都包含公共 原型属性,因为这样的对象var myObj = {}没有任何公共原型。

请参阅下面的 concole 屏幕截图 - 请注意__proto__使用 {} 创建的对象不存在公共原型属性(而不是 private ) -在此处输入图片说明

第二个问题——我在查一个简单函数的原型链的时候看了上面的文献,一开始好像是无限深的——后来发现原型的构造函数其实是在引用自己。Mozilla 文档中提到的不同——这里的原型链似乎并没有以null结束

我想这是为了支持基于原型的继承而设计的。但是,如果可以解释一下,原型构造函数中的这种自我引用究竟如何帮助实现这一目标,我将不胜感激

在此处输入图片说明

某些表演

如果您想查找那里描述的原型链:

Each object has a private property which holds a link to another object called its prototype. That prototype object has a prototype of its own, and so on until an object is reached with null as its prototype. By definition, null has no prototype, and acts as the final link in this prototype chain.

You should look at the __proto__ properties (which will point to the internal prototype of the object being examined).

在此处输入图片说明

Here, you see that the internal prototype of myFunctionObj is Function.prototype, and going up the next level of __proto__ takes you to Object.prototype, which has no __proto__ (the end of the prototype chain).

The prototype property of myFunctionObj refers to the internal prototype of instantiated objects (like const obj = new myFunctionObj();, and then obj.__proto__ === myFunctionObj.prototype), not to the internal prototype of the myFunctionObj itself.

Only functions have a .prototype property, usually, and their .prototype will refer to the internal prototype of instances created with new. Plain objects don't have a .prototype property (because plain objects can't be called to instantiate something), but you can still access the internal prototype of a plain object (or of anything) using Object.getPrototypeOf (or .__proto__):

const obj = {};
console.log(
  obj.__proto__ === Object.prototype,
  Object.getPrototypeOf(obj) === Object.prototype,
);

A function's .prototype.constructor is indeed just a self-reference back to the function.

function foo(){};
console.log(
  foo.prototype.constructor === foo
);

这不是非常有用的,当你已经有了构造参考,但它当你有一个实例的引用是有用的,但不知道它的构造-与原型继承,访问实例的.constructor属性会给你使用的功能构建它:

const bar = (() => {
  function Bar(){}
  const bar = new Bar();
  return bar;
})();

// now Bar is out of scope
// but you can still reference it because you have an instance:
const Bar = bar.constructor;
console.log(Bar);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么要分配函数原型的构造函数来实现自身功能?Programmer.prototype.constructor =程序员

来自分类Dev

为什么javascript函数原型需要修复构造函数?

来自分类Dev

为什么在原型而不是构造函数中声明实例属性?

来自分类Dev

在构造函数内部*分配原型方法-为什么不呢?

来自分类Dev

为什么此语法会导致其属性构造函数指向其自身的构造函数呢?

来自分类Dev

为什么复制构造函数的参数是引用而不是指针?

来自分类Dev

为什么要在构造函数中使用对const的引用?

来自分类Dev

为什么Javascript类引用相同的构造函数?

来自分类Dev

为什么复制构造函数的参数是引用而不是指针?

来自分类Dev

为什么不使用回调函数?

来自分类Dev

如果更改了构造函数的原型,为什么对象的构造函数属性也会发生变化?

来自分类Dev

为什么替换构造函数的原型没有反映在对象中?

来自分类Dev

为什么不应该通过原型向JavaScript构造函数添加功能呢?

来自分类Dev

为什么不能使用构造函数/原型组合模式访问此实例变量?

来自分类Dev

为什么在从构造函数返回时未定义原型?

来自分类Dev

为什么将方法放在类的原型上而不是在构造函数中声明呢?

来自分类Dev

为什么可以将构造函数原型分配给对象及其含义

来自分类Dev

为什么不应该通过原型向JavaScript构造函数添加功能呢?

来自分类Dev

为什么复制构造函数不需要检查输入对象是否指向自身?

来自分类Dev

什么是引用复制构造函数?

来自分类Dev

为什么要为函数本身分配函数原型的构造函数?Programmer.prototype.constructor =程序员

来自分类Dev

JavaScript中的原型有什么意义?为什么不直接将方法添加到构造函数?

来自分类Dev

JavaScript中的原型有什么意义?为什么不直接将方法添加到构造函数?

来自分类Dev

为什么要使用函数原型?

来自分类Dev

为什么在函数原型中使用“ [*]”而不是“ []”?

来自分类Dev

为什么要使用函数原型?

来自分类Dev

原型方法不是函数,为什么?

来自分类Dev

为什么添加析构函数会更改此结构的复制构造函数行为?

来自分类Dev

在Javascript中,为什么从构造函数返回函数会破坏对象?

Related 相关文章

  1. 1

    为什么要分配函数原型的构造函数来实现自身功能?Programmer.prototype.constructor =程序员

  2. 2

    为什么javascript函数原型需要修复构造函数?

  3. 3

    为什么在原型而不是构造函数中声明实例属性?

  4. 4

    在构造函数内部*分配原型方法-为什么不呢?

  5. 5

    为什么此语法会导致其属性构造函数指向其自身的构造函数呢?

  6. 6

    为什么复制构造函数的参数是引用而不是指针?

  7. 7

    为什么要在构造函数中使用对const的引用?

  8. 8

    为什么Javascript类引用相同的构造函数?

  9. 9

    为什么复制构造函数的参数是引用而不是指针?

  10. 10

    为什么不使用回调函数?

  11. 11

    如果更改了构造函数的原型,为什么对象的构造函数属性也会发生变化?

  12. 12

    为什么替换构造函数的原型没有反映在对象中?

  13. 13

    为什么不应该通过原型向JavaScript构造函数添加功能呢?

  14. 14

    为什么不能使用构造函数/原型组合模式访问此实例变量?

  15. 15

    为什么在从构造函数返回时未定义原型?

  16. 16

    为什么将方法放在类的原型上而不是在构造函数中声明呢?

  17. 17

    为什么可以将构造函数原型分配给对象及其含义

  18. 18

    为什么不应该通过原型向JavaScript构造函数添加功能呢?

  19. 19

    为什么复制构造函数不需要检查输入对象是否指向自身?

  20. 20

    什么是引用复制构造函数?

  21. 21

    为什么要为函数本身分配函数原型的构造函数?Programmer.prototype.constructor =程序员

  22. 22

    JavaScript中的原型有什么意义?为什么不直接将方法添加到构造函数?

  23. 23

    JavaScript中的原型有什么意义?为什么不直接将方法添加到构造函数?

  24. 24

    为什么要使用函数原型?

  25. 25

    为什么在函数原型中使用“ [*]”而不是“ []”?

  26. 26

    为什么要使用函数原型?

  27. 27

    原型方法不是函数,为什么?

  28. 28

    为什么添加析构函数会更改此结构的复制构造函数行为?

  29. 29

    在Javascript中,为什么从构造函数返回函数会破坏对象?

热门标签

归档