2015-05-29 2 views
1

У меня есть это странное поведение и надеюсь, что вы можете мне помочь. =)Узел против Chrome, реализация instanceof, несколько файлов

У меня есть настройка, где мне нужно запустить JavaScript с использованием Mocha. Код генерируется от TypeScript, а тесты выполняются как в браузере, так и в nodejs через модули и commonjs. Проблема в том, что я хочу использовать instanceof, но, по-видимому, поведение отличается в зависимости от того, выполняется ли код в Node или в Chrome. Пример следующий.

// file Actions.ts 
Class Action {..} 
Class ViewAction extends Action {..} 
Class MyViewAction extends ViewAction {..} 

// file App.ts 
var action = new MyViewAction(); 

// file App.ts or Elsewhere.ts 
foo(action) { 
    var testA = action instanceof MyViewAction; 
    var testB = (<any>action.constructor).name === "MyViewAction"; 
} 

Дело в том, если Foo вызывается в другом commonjs модуле, testA становится false, если запустить в Node но true, если запустить в Chrome, в то время как testB в обоих случаях true.

Если foo запущен в том же файле, что и действие назначено, код будет работать последовательно.

Может ли кто-нибудь воспроизвести эту ошибку или объяснить, что я делаю неправильно?

Приветствия

+0

Ссылка на 'MyViewAction' присутствует в обоих случаях? – Sirko

ответ

2

вар действие = MyViewAction();

Вам необходимо позвонить ему new i.e. new MyViewAction, но я подозреваю, что вы уже это делаете.

Testa становится ложным, если запустить в узле, но верно, если запустить в Chrome

Я подозреваю, что у вас есть TWOMyViewAction функции определены.

  • В Chrome из-за глобальное пространство имен последний выигрывает, и путем ссылки сравнения (что делает instanceof) до MyViewAction точки к одной и той же функции.

  • В узле каждый файл является его собственным модулем, и нет никакого глобального столкновения пространства имен и, следовательно, у вас есть две MyViewAction функции и иое сравнение возвращает ложь, но так как они назвали это же .name строки же.

+0

Да, извините, я забыл «новое» в описании. – tugend

+0

Хорошо, что могут быть два определения MyViewAction, но я не думаю, что это так. Я вернулся и сделал еще несколько тестов, и кажется, что: ** экземпляр действия ViewAction ** оценивается как true, iff определение foo в другом файле. Также я могу гарантировать, что в кодовой базе, где определен MyViewAction, есть ровно одно место. – tugend

+0

Я думаю, что это довольно странно, поскольку имя конструктора и все, что я добавляю в MyViewAction, явно доступны.=/ – tugend

Смежные вопросы