0

我有这样的例子。

function Bar() {
    this.barVal = "BarValue";
}

function Foo() {
    this.fooVal = "FooValue";
    Bar.apply(this, arguments);   // here I use apply() to get access everything in Bar from Foo;
}
var barObj = new Bar;
var fooObj = new Foo;

alert(fooObj.barVal);     // the output is `BarValue`

现在我希望以同样的方式从 Bar 访问 Foo 中的所有内容。我修改我的代码:

function Bar() {
    this.barVal = "BarValue";
    Foo.apply(this, arguments);   // I add the same line of code, just change names
}

function Foo() {
    this.fooVal = "FooValue";
    Bar.apply(this, arguments);   // and also leave it here because I want previous functionality too
}
var barObj = new Bar;
var fooObj = new Foo;

alert(fooObj.barVal);     
alert(barObj.fooVal);     // there is no any output for both

但是没有任何输出。我实际上发生了一些错误。当我隐藏Foo.apply(this, arguments);在评论下时,电话alert(fooObj.barVal);再次起作用。当我这样检查时:

function Bar() {
    this.barVal = "BarValue";
    try {
        Foo.apply(this, arguments);
    }
    catch(e) {
        alert(e);
    }
}

它甚至会停止浏览器的工作(我使用 Chrome,所以出现了带有像素文件夹的整个黑屏)。在警报窗口中它写道RangeError: undefined

但是因为我在这个序列中有警报呼叫

alert(fooObj.barVal);     
alert(barObj.fooVal);

第二个警报准确地显示了我正在等待的内容 - 它显示了BarValue

当我在 Bar 中复制它时,为什么 apply() 不起作用?是否有可能以某种方式在两个功能之间建立这种门?

4

1 回答 1

2

applythis使用您指定的任何内容调用该函数。

这点考虑一下吧。如果Foo调用BarBar调用Foo,那么你最终会得到无限递归。你需要某种方式说“不要再打电话Foo”。或者至少,Foo 需要能够看到“嘿,我已经被叫过一次;这次不要做任何事情”。

但说实话,你需要做任何这些气味的事实。你通常不想要这样的循环依赖;如果这两个东西是如此交织在一起以至于它们需要彼此的功能才能工作,那么听起来你可能能够将交织在一起的东西分成一个单独的类型并FooBar那里使用两者,或者两者都继承它,或者某物。但我需要看到更多的设计才能说出任何具体的内容。

于 2012-02-11T18:16:25.920 回答