Использование функции стрелки, назначенное объектом module.export, не может правильно решить эту проблему - PullRequest
0 голосов
/ 04 октября 2018

Кажется, что только если я заполню дочерний объект непосредственно в функции Base, это единственный способ, которым функция getSettings может правильно видеть свойство this.name, но я старался, чтобы мои объекты находились в разных файлах, чтобы избежатьс одним большим файлом.

***child.js***
module.exports : {
  getSettings: ()=>{
    return this.name === 'foobar'
  }
}

***base.js***
var Child = require('./child.js')
function Base(){
  this.name = 'foobar'
  this.child = Child
  this.child2 = {}
  for (var prop in Child){
    this.child2[prop] = Child[prop]
  }
  this.child3 = {
    getSettings: ()=>{
      return this.name === 'foobar'
    }
  }
}

***index.js****
var Base = require('./base.js')

var b = new Base()
b.child.getSettings() //FAILS BECAUSE this.name is undefined
b.child2.getSettings() //FAILS BECAUSE this.name is undefined
b.child3.getSettings() //PASSES. this.name is defined

1 Ответ

0 голосов
/ 04 октября 2018

В JS OOP принято называть экземпляр класса this, поэтому семантически некорректно для объектов child ссылаться на родительский объект как this.Это также затрудняет работу с таким объектом, как child, который не получает желаемого контекста, как лексический this (как это делает child3).

child объект, вероятно, должен быть классом, которыйвнедряются с родительским экземпляром как зависимость.

module.exports = class Child(parent) {
  constructor(parent) {
    this.parent = parent;
  }

  getSettings() {
    return this.parent.name === 'foobar'
  }
}

var Child = require('./child.js')
function Base(){
  this.name = 'foobar'
  this.child = new Child(this);
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...