我有这样的例子。
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() 不起作用?是否有可能以某种方式在两个功能之间建立这种门?