工厂功能及组成

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

我的 JavaScript 代码如下:

const calculateDiameter = (circle) => ({
  get diameter() {
    return (circle.radius * 2);
  }
});

const calculateCircumfrance = (circle) => ({
  get circumfrance () {
    return (2 * (22 / 7) * circle.radius)
  }
});

const createCircle = (radius) => {
  const circle = {
    radius
  };
  
  return Object.assign(
    circle,
    calculateDiameter(circle),
    calculateCircumfrance(circle)
  )
}

// Create a cirlce
const myCircle = createCircle(2);
console.log( myCircle.diameter ) // returns: 4
console.log( myCircle.circumfrance ) // returns: 12.571428571428571

我想做的是将

calculateDiameter()
的输出传递给
calculateCircumfrance()
,所以这就是我所做的:

// The following function was NOT modified
const calculateDiameter = (circle) => ({
  get diameter() {
    return (circle.radius * 2);
  }
});

const calculateCircumfrance2 = (circle) => ({
  get circumfrance () {
    return ((22 / 7) * circle.diameter)
  }
});

const createCircle2 = (radius) => {
  const circle = {
    radius
  };

  const circleWithDiameter = Object.assign(
    circle,
    calculateDiameter(circle),
  )
  
  return Object.assign(
    circleWithDiameter,
    calculateCircumfrance2(circleWithDiameter)
  )
}

// Create a cirlce
const myCircle2 = createCircle2(2);
console.log( myCircle2.diameter ) // returns: 4
console.log( myCircle2.circumfrance ) // returns: 12.571428571428571

createCircle2()
中描述的这种方法正确吗?换句话说,我应该创建一个中间步骤对象(即
circleWithDiameter
)以允许我将直径传递给
calculateCircumfrance2()
吗?这似乎是一个超载。有没有更简洁或直接的方式从
calculateDiameter()
内部调用
calculateCircumfrance2()

这个问题的原因是我将有一个非常复杂的对象(而不是圆圈),而那些中间步骤似乎太复杂了。

javascript composition function-composition factory-function
1个回答
-2
投票

从可组合项获取属性并将它们分配给工厂中的对象,然后只需使用

this
。作为一个例子,我添加了一些方法来表明它们也能工作:

const calculateDiameter = {
  get diameter() {
    return this.radius * 2;
  },
  printDiameter(){
    console.log(this.diameter);
  }
};

const calculateCircumfrance = {
  get circumfrance () {
    return (22 / 7) * this.diameter
  },
  printCircumfrance(){
    console.log(this.circumfrance);
  }
};

const createCircle = (radius) => {
  const self = {radius};
    [calculateDiameter, calculateCircumfrance]
      .forEach(mixin => Object.entries(Object.getOwnPropertyDescriptors(mixin))
        .forEach(([prop, desc]) => Object.defineProperty(self, prop, desc)));
  return self;
}


const myCircle = createCircle(2);
myCircle.printDiameter() // returns: 4
myCircle.printCircumfrance() // returns: 12.571428571428571

© www.soinside.com 2019 - 2024. All rights reserved.