Как передать контекст вызова в функцию прототипа?

192
18 мая 2018, 07:30

Не понимаю как передать this в новый объект. Если это делать из конструктора то все отлично работает а если делать через прототип то нет.

const ACCOUNT = require('./account');
function Model(dataBase, session){
    this.db = dataBase;
    this.session = session;
}
Model.prototype.account = new ACCOUNT(this);

Пытался сделать так:

const ACCOUNT = require('./account');
function Model(dataBase, session){
    this.db = dataBase;
    this.session = session;
}
Model.prototype.account = function() {
    return new ACCOUNT(this);
}

Но не работает, не могу получить доступ к методам ACCOUNT.

UPDATE: Объект Account

function Account(global){
  this.global = global;
}
Account.prototype.test = function(){
  return this.global.session;
}
module.exports = Account;

В дальнейшем не могу получить метод test объекта Model пишет что это не функция.

let model = new ModelObj(core.db, request.session);
console.log(await model.account.test());
Answer 1

Во втором случае нельзя обратиться к метода Account, просто потому, что метод

Model.prototype.account

это функция, которая возвращает новый объект Account.

А у функции нет метода test.

То есть вызов должен быть заменен на

await model.account().test()

Либо должен заполняться внутри конструктора, если нужен доступ к конкретному объекту Model:

const ACCOUNT = require('./account');
function Model(dataBase, session){
    this.db = dataBase;
    this.session = session;
    this.account = new ACCOUNT(this);
}

Стоит обратить внимание, что в первом случае, в качестве this будет передан объект модуля, а не объект класса Model.

READ ALSO
Валидация на совпадение паролей в форме регистрации,блок отправки при ошибке работает,при совпадении не отправляет

Валидация на совпадение паролей в форме регистрации,блок отправки при ошибке работает,при совпадении не отправляет

Как сделать так что бы при else форма отправлялась пользователю,грубо говоря как выше отменить действие eventpreventDefault(); (return false; не работает) ?

185
Скрыть/Показать DIV по выбору RADIO

Скрыть/Показать DIV по выбору RADIO

Есть вот такая форма, при выборе к примеру "футболки" должен открыться "блок с футболками", а если выбрать "шорты", то "блок с футболками" должен...

215