JavaScript меня в могилу сведет [Node.js]

Даже и не знаю как вопрос задать, но
var model1 = new require('./test/model1')();
var model2 = new require('./test/model2')();

model1.test();
model2.test();


model1.js
module.exports = function() {
    var self = this;

    self.test = function() {
        console.log("MODULE 1");
    }

    return self;
}

model2.js
module.exports = function() {
    var self = this;

    self.test = function() {
        console.log("MODULE 2");
    }

    return self;
}


В результате
MODULE 2
MODULE 2


Получается, что функция test() со второго модуля перезаписывает функцию с таким же названием в первом модуле.
Как так? Это баг или фича?
И как решить мою задачу?

Спасибо и прошу прощения за сумбурность.

Ладно-ладно, я все понял. Я был не прав. Огромное спасибо за помощь!
  • Вопрос задан
  • 5408 просмотров
Решения вопроса 1
@egorinsk
Это не баг и не фича, вы просто неправильно используете this.

У вас при вызове функции this = глоальному объекту, потому и ошибки, надо писать model = new require(....). Советую почитать, например, тут, про использование this и функции: javascript.ru/tutorial/object/thiskeyword (хотя объяснение там так себе)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Stdit
@Stdit
// m1.js
module.exports.Model = function() {
  this.test = function() {
    console.log("MODULE 1");
  };
};

// m2.js
module.exports.Model = function() {
  this.test = function() {
    console.log("MODULE 2");
  };
};

//test.js
var model1 = new (require('./lib/m1.js').Model);
var model2 = new (require('./lib/m2.js').Model);

model1.test();
model2.test();

//result
MODULE 1
MODULE 2
Ответ написан
Комментировать
Mithgol
@Mithgol
Проблема именно этого Вашего непонимания, насколько я её вижу, решается вдумчивым чтением пособия по приоритету операторов, в языке JavaScript употребляемых. После этого наступит понимание, наступит состояние всеобъемлющей ясности.
Ответ написан
Комментировать
операторы

Как видите function call ниже оператора new, и если выделить скобками вашу запись, то интерпретатор делает следующее —
var model1 = (new require('./test/model1'))();

Функция require отработает хорошo, даже не зависимо от какого контекста была вызвана — а последующий function call будет уже в контексте global
self == model1 == model2 == global

Разные решения:
var module = new (require('module'))();
// екзотические варианты -
var module = new require('module').prototype.constructor();
var module = new new require('module')();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы