当前位置: 首页 > 知识库问答 >
问题:

JS中的合成

宋斌
2023-03-14

我正在学习JS中的作文概念。下面是我的演示代码。

moveby函数将值正确分配给xy

但是,setFillColor函数不将传递的值赋给FillColor

调用setfillcolor函数时到底发生了什么?

null

js lang-js prettyprint-override">const withMoveBy = (shape) => ({
  moveBy: (diffX, diffY) => {
    shape.dimensions.x += diffX;
    shape.dimensions.y += diffY;
  },
});

const withSetFillColor = (shape) => ({
  setFillColor: (color) => {
    console.log(shape.fillColor);                      // 1
    shape.fillColor = color;
    shape.dimensions.fillColor = color;
    console.log(shape.fillColor);                      // 2
  },
});

const shapeRectangle = (dimensions) => ({
  type: 'rectangle',
  fillColor: 'white',
  dimensions,
});

const shapeCircle = (dimensions) => ({
  type: 'circle',
  fillColor: 'white',
  dimensions,
});

const createShape = (type, dimensions) => {
  let shape = null;
  switch (type) {
    case 'rectangle': {
      shape = shapeRectangle(dimensions);
      break;
    }
    case 'circle': {
      shape = shapeCircle(dimensions);
      break;
    }
  }

  if (shape) {
    shape = {
      ...shape,
      ...withSetFillColor(shape),
      ...withMoveBy(shape),
    };
  }
  return shape;
};

let r = createShape('rectangle', {
  x: 1,
  y: 1,
  width: 10,
  height: 10,
});

let c = createShape('circle', { x: 10, y: 10, diameter: 10 });

r.moveBy(2, 3);
c.moveBy(1, 2);

r.setFillColor('red');
c.setFillColor('blue');

console.log(r);
console.log(c);

null

输出:

对于矩形和圆形,标记为//1的行打印白色

标记为//2的行打印矩形的红色和圆形的蓝色

最终输出为:

{
  "type": "rectangle",
  "fillColor": "white",
  "dimensions": {
    "x": 3,
    "y": 4,
    "width": 10,
    "height": 10,
    "fillColor": "red"
  }
}
{
  "type": "circle",
  "fillColor": "white",
  "dimensions": {
    "x": 11,
    "y": 12,
    "diameter": 10,
    "fillColor": "blue"
  }
}

作为对象属性的FillColor仍然是White。但是,dimensions中的值是正确的。

共有1个答案

祝花蜂
2023-03-14

问题源于createshape-me的注释中的分配:

    // creating the "new object"
    shape = {
      ...shape, // shallow copying of the "old object"
      ...withSetFillColor(shape),
      ...withMoveBy(shape),
    };

在这里,您创建了一个新对象,该对象由以下内容组成:

  • 浅层复制现有...Shape的属性(类型、填充颜色、作为对象的维度)
  • SetFillColor,绑定到Shape(旧对象)
  • 的闭包
  • moveby,绑定到shape(旧对象)
  • 的闭包

执行此语句后,您创建了两个形状:

  • 方法操作的“旧对象”
  • 返回的“新对象”

在从旧对象复制的属性中,只有dimensions是一个非原语值,因此它在实例之间共享。

然后,当你打电话:

r.moveBy(2, 3);

它更改了oldshape.dimensions,但它与newshape.dimensions是同一个对象,因此在输出中可见。

然而,这一呼吁:

r.setFillColor('red');

修改OldShapeFillColor属性,您没有看到该属性。它还写入oldshape.dimensions.fillcolor,该文件同样在对象之间共享,因此更改在两个对象中都可见。

 类似资料:
  • 我有一个集合,我想比较它是否包含所有的值。 这就是我想要的 我相信一定有其他方法来检查,而不是重复。

  • 问题内容: 我们有Null合并运算符,可以按以下方式使用 我们可以在React JS中做同样的事情吗? 我发现我们可以使用&&运算符 在 address.ts 文件中 我需要像.net功能那样在带有React JS的打字稿中是可能的吗? 就像是: 问题答案: 这是传说中的第16期在TypeScript中建议的功能 在此功能的ECMAScript规范确定之前,不会将其引入TypeScript中,因为

  • 本文向大家介绍常用的js方法合集,包括了常用的js方法合集的使用技巧和注意事项,需要的朋友参考一下 数组及对象深拷贝 获取地址栏参数 修改微信title 兼容ios 移动端响应式样式 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 我添加了respone头(“cross-origin-opener-policy”,“same-origin”)来使用SharedArrayBuffer(以支持webassembly)。但是现在我在我的页面中添加第三方JS时遇到了麻烦,这将被跨源隔离阻止。有什么方法可以在webassembly中使用第三方JS吗?

  • 本文向大家介绍js模仿java的Map集合详解,包括了js模仿java的Map集合详解的使用技巧和注意事项,需要的朋友参考一下 java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。List 适用于按数值索引访问元素的

  • 本文向大家介绍JS打印组合功能,包括了JS打印组合功能的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了JS打印组合功能,功能全面,供大家参考,具体内容如下 1.局部打印--即想打印什么地方就打印什么地方  解决办法:  将不想打印的地方隐藏起来  <style type="text/css" media=print> .noprint{display : none }  分页的时候用