由module.export对象分配的箭头功能使用无法正确解决此问题

时间:2018-10-04 12:23:24

标签: node.js this arrow-functions

似乎只有当我直接在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 :(得分:0)

在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);
  ...
}