Javascript中的无限原型继承

sub*_*ime 4 javascript prototypal-inheritance

我正在学习Javascript中的原型继承,并且据我所知,我正在尝试使用它将进程发送到无限递归链接.

我对原型继承的想法是一个对象(它是一个函数)持有原型链接.该对象的任何实例都指向它.所以如果我说instance.someproperty它会查看父对象的原型链.

假设这个,如果我只是将函数原型列表指向自身,当对象试图访问某些属性时,它应该进入无限循环.

 var p = function(){};

 p.prototype = p;
 // I also tried p.prototype = new p();

 var q = new p();

 // and now when I say q.something, it should never be able to find it.
Run Code Online (Sandbox Code Playgroud)

我想知道为什么这不起作用,我怎么能让它进入无限循环.

Rob*_*obG 5

使用更常见的风格:

function P(){};
P.prototype = P;
Run Code Online (Sandbox Code Playgroud)

在ECMA-262中,内部原型属性用表示[[Prototype]].

分配不同的对象来P.prototype不修改P[[Prototype]],所以它的继承链保持为:

P : P[[Prototype]] -> Function.prototype -> Object.prototype -> null
Run Code Online (Sandbox Code Playgroud)

鉴于PP.prototype都指向同一个对象,P[[prototype]]的实例链是:

p : p[[Prototype]] -> P : P[[Prototype]] -> Function.prototype -> Object.prototype -> null
Run Code Online (Sandbox Code Playgroud)

所以没有无限循环.

没有P.prototype的赋值,p的原型链将是:

p : p[[Prototype]] -> P.prototype -> Object.prototype -> null
Run Code Online (Sandbox Code Playgroud)

要获得无限循环,您可以在支持它的那些浏览器__proto__中将对象分配给它自己的属性(公共访问方式[[Prototype]]),但我不确定这是一个好主意,Firefox抛出:

"TypeError: cyclic __proto__ value".
Run Code Online (Sandbox Code Playgroud)