Ich habe mir kürzlich das Problem des js-Prototyps angesehen und es im Grunde verstanden, aber als ich es in der Konsole geöffnet habe, habe ich ein sehr seltsames Problem festgestellt. Hier ist ein Beispiel
function Persion(){};
var persion1 = new Persion();
persion1;
Geben Sie den Code in die Steuerung ein, es liegt auf der Hand
persion1.__proto__ = Persion.prototype
Der Konstruktor des Prototypobjekts zeigt auf Persion(), und der Prototyp im Konstruktor Persion zeigt auf das Prototypobjekt. Persion.prototype
Ist das eine Endlosschleife in js? Stimmt etwas mit meinem Verständnis nicht?
Dies ist ein Bild, das ich online gefunden habe. Das Problem liegt im roten Teil. Dieser Teil zeigt in eine Schleife
谢邀,我刚关注了这个问题。。您就邀请我了。。
我只知道,这里确实就是循环引用,在浏览器上会不断的显示下去,但在内存里它就是一层的,所以不会有什么问题。
首先明确两个概念,引用变量 和 对象,在那一大段引用变量的互相引用中其实只涉及到两个对象
我们姑且把他们称为对象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
.............