我的 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()
?
这个问题的原因是我将有一个非常复杂的对象(而不是圆圈),而那些中间步骤似乎太复杂了。
从可组合项获取属性并将它们分配给工厂中的对象,然后只需使用
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