Javascript Object.prototype和循环引用

时间:2012-05-30 22:19:00

标签: javascript prototype

据我所知,在Javascript中,变量总是通过引用分配,这意味着如果我写:

var a = {};
var b = a;
b.foo = 'string';
console.log(a.foo); // prints 'string'

是的,因此编写以下代码会返回错误:

var a = function(){};
var b = function(){};

b.foo=a;
a.bar = b;

console.log(a); // prints { [Function] bar: { [Function] foo: [Circular] } }

这没关系,因为a.bar指向b,b.foo指向a,其.bar参数再次指向b,依此类推。这是循环参考。

现在,我注意到以下事项:

var a = function(){};
var b = function(){};

b.foo=a;
a.prototype = b;

console.log(a); // prints [Function]

我刚用a.prototype替换了a.bar,现在,我没有循环引用错误。

我认为这意味着无法通过引用为Object.prototype分配值。谁能确认一下?这是规则的例外(至少如果确实有一个)?

谢谢!

2 个答案:

答案 0 :(得分:2)

这不是错误。这只是一个印刷大会。

答案 1 :(得分:1)

不,这似乎只是你控制台的一个异常现象。你在哪个浏览器遇到过这个?例如,Opera的Dragonfly不会列出函数的任何属性。

另外,我还没有看到一个控制台在记录的对象中发出循环引用...

然而,循环引用也出现在你的第二个例子中。只是尝试打印b.foo.prototype.foo.prototype.foo... :-)它只会不会这样显示,因为函数的“prototype”属性是不可枚举的(参见spec 13.2, #18)。