您是否可以不使用此功能来更改工厂函数的属性?

问题描述 投票:0回答:1

我一直在阅读使用工厂函数而不是类的好处,但是,我很难让它们以类似的方式工作。

例如,带有类:

class NumberManager {
    constructor(numbers){
        this.numbers = numbers;
    }

    removeNumber(input){ 
        this.numbers = this.numbers.filter( number => number != input )
    }
}

n = new NumberManager([1, 2])
n.numbers // --> [1, 2]
n.removeNumber(2)
n.numbers // --> [1]

但是,具有工厂功能:

const NumberFactory = (numbers) => {
  const removeNumber = (input) => {
    numbers = numbers.filter( number => number != input )
  }

  return {
    numbers,
    removeNumber
  }
}

n = NumberFactory([1, 2])
n.numbers // --> [1, 2]
n.removeNumber(2)
n.numbers // --> [1, 2]

是否有可能具有类所具有的类似自由度(例如,轻松地改变属性),而不必使用诸如this(可能会在执行上下文中中断)和new(如果必须这样做可能会中断)之类的东西。将类转换为工厂)?

javascript ecmascript-6 factory es6-class
1个回答
3
投票

将要从工厂返回的对象放入变量,然后再返回它,然后可以引用并对该变量进行突变:

const NumberFactory = (numbers) => {
  const removeNumber = (input) => {
    instance.numbers = instance.numbers.filter( number => number != input );
  };
  const instance = { numbers, removeNumber };

  return instance;
}

const n = NumberFactory([1, 2]);
console.log(n.numbers); // --> [1, 2]
n.removeNumber(2);
console.log(n.numbers); // --> [1]
© www.soinside.com 2019 - 2024. All rights reserved.