JS ООП.Наследование и функция apply ().Почему это не работает? - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть такой пример.

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? Можно ли как-то сделать такие ворота между двумя функциями?

1 Ответ

2 голосов
/ 11 февраля 2012

apply вызывает функцию, используя любой this, который вы укажете.

Подумайте об этом на секунду.Если Foo вызывает Bar, а Bar вызывает Foo, то вы получите бесконечную рекурсию.Вам нужен какой-то способ сказать "не звоните Foo снова".Или, по крайней мере, Фу должен быть в состоянии увидеть «эй, меня уже однажды вызывали; на этот раз ничего не делай».

Правда, правда, тот факт, что тебе нужносделать любой из этих запахов.Обычно вы не хотите таких циклических зависимостей;если две штуки настолько переплетены, что им нужны функциональные возможности друг друга для работы, может показаться, что вы могли бы разделить переплетенные вещи на отдельный тип и использовать оттуда и 1012 *, и Barоба наследуют от этого, или что-то.Но мне нужно больше посмотреть на дизайн, чтобы сказать что-то конкретное об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...