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)
我想知道为什么这不起作用,我怎么能让它进入无限循环.
使用更常见的风格:
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)
鉴于P和P.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)
| 归档时间: |
|
| 查看次数: |
350 次 |
| 最近记录: |