最近看js原型的问题,基本上已经理解,但是在控制台打开发现很奇怪的问题,举个例子
function Persion(){};
var persion1 = new Persion();
persion1;
在控制输入一下代码,按理说
persion1.__proto__ = Persion.prototype
Persion.prototype
原型对象的构造器 指向 Persion(), 而构造函数 Persion里prototype又指向 原型对象,
js中是这样无线循环指向下去吗?是我理解有问题吗?
这是网上找的一副图,问题就在红色的那部分,这部分循环指向啊
谢邀,我刚关注了这个问题。。您就邀请我了。。
我只知道,这里确实就是循环引用,在浏览器上会不断的显示下去,但在内存里它就是一层的,所以不会有什么问题。
首先明确两个概念,引用变量 和 对象,在那一大段引用变量的互相引用中其实只涉及到两个对象
我们姑且把他们称为对象ObjP(原型对象)和对象Objf(函数对象)
对象objf中有一个属性p指向objp,q的内存结构有两部分,一部分保存着它的属性名“p”,另一部分保存着objp的地址。
同样,对象objp中有一个属性f指向objf。
打个比方,两个手机A,B,互相存着对方的手机号b,a。A可以通过A.b打给B,B可以通过B.a打给A,他们之间可以来回打无数次电话,但只存在两个手机。它们之间存在互相的联系,但联系本身占用的资源是很少的。只有打电话的时候才会产生附加的资源消耗。
我们看到的结构对浏览器是没有意义的,它只是把联系具象化给咱们看。就像如何向别人证明A存着B的手机号,当着你的面打个电话。你倒好,老让人家来回打。其实你不去继续往下点时,浏览器就不会去做那么无聊的事。
至于着“互相引用”什么时候到头?,没有所谓的头,存手机号就是一下的事儿,被逼着老来回打电话才是最痛苦的。
换句话说,等你不在往下点时浏览器就不用为了应付你让objp和objf继续“相互引用了”
这个只是存在两个对象的相互引用. 我们可以构造这样的例子.
结果就会出现:
实际上就只存在两个对象,只不过你每次展开那个属性的时候,应该是相当于打印那个对象,而你不断的交替打印对象 a 和 b,就会出现那样的结果.
Person.prototype.constructor == Person //true
你在chrome控制台里输出的是 Person.prototype
你打开了 Person.prototype.constructor -->Person
又打开了 Person.protorype.constructor.prototype -->Person.prototype
又打开了 Person.prototype.constructor.prototype.constructor -->Person
又打开了 Person.protorype.constructor.prototype.constructor.prototype -->Person.prototype
.............