У меня есть такой пример.
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`
Теперь я хочу таким же образом получить доступ ко всему в 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
.
Почему apply () не работает, когда я дублирую его в Bar? Можно ли как-то сделать такие ворота между двумя функциями?