2

我知道在 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 不能通过引用赋值。任何人都可以确认吗?这是规则的一个例外(至少如果它是真的有一个例外)?

谢谢 !

4

2 回答 2

2

那不是错误。这只是一个印刷惯例。

于 2012-05-30T22:27:15.637 回答
1

不,这似乎只是您的控制台的异常情况。您在哪个浏览器中遇到这种情况?例如,Opera 的 Dragonfly 不会列出函数的任何属性。

此外,我还没有看到一个控制台抱怨记录对象中的循环引用......

然而,在您的第二个示例中也存在循环引用。试着打印b.foo.prototype.foo.prototype.foo...:-) 它只是不会这样显示,因为prototype函数的 " " 属性是不可枚举的(参见规范 13.2,#18)。

于 2012-05-30T22:24:25.347 回答