使用对象组合保持自我属性私有

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我正在看一个关于对象组成的博客,它在这里显示了这段代码:

const canSayHi = self => ({
  sayHi: () => console.log(`Hi! I'm ${self.name}`)
});
const canEat = () => ({
  eat: food => console.log(`Eating ${food}...`)
});
const canPoop = () => ({
  poop: () => console.log('Going to 💩...')
});

// Combined previous behaviours
const socialBehaviors = self => Object.assign({}, canSayHi(self), canEat(), canPoop());

const alligator = name => {
  const self = {
    name
  };

  const alligatorBehaviors = self => ({
    bite: () => console.log("Yum yum!")
  });

  return Object.assign(self, socialBehaviors(self), alligatorBehaviors(self));
};


const jack = alligator("jack");

你当然可以访问名称属性。如果我希望这个属性是私有的,那么jack.name返回undefined会怎样。我假设这需要一个闭包但不确定最好/最干净的方法,或者只是传统的方式。

我明白你可能不会把自己传递给object.assign,但是如果你在自己的变量混合中你想要一些私有而一些是公开的呢?我原本认为这里的解决方案是拥有一个包含所有私有变量的'state'字面值和一个包含所有公共变量的'base'文字,如果你想访问基本文字中的任何内容,那么你需要使用它这在objects.assign中的其他对象中。

提问于
用户回答回答于

使用了内部各功能.name通过 self当对象被明确地构造,所以可以只返回

Object.assign({}, ...

代替

Object.assign(self, ...

并且返回的对象将没有name属性。

const canSayHi = self => ({
  sayHi: () => console.log(`Hi! I'm ${self.name}`)
});
const canEat = () => ({
  eat: food => console.log(`Eating ${food}...`)
});
const canPoop = () => ({
  poop: () => console.log('Going to 💩...')
});

// Combined previous behaviours
const socialBehaviors = self => Object.assign({}, canSayHi(self), canEat(), canPoop());

const alligator = name => {
  const self = {
    name
  };

  const alligatorBehaviors = self => ({
    bite: () => console.log("Yum yum!")
  });

  return Object.assign({}, socialBehaviors(self), alligatorBehaviors(self));
};


const jack = alligator("jack");
console.log('jack.name:', jack.name);
jack.bite();
jack.eat('somefood');
jack.sayHi();
用户回答回答于

只是不要用name进入self第一行alligator。您仍然可以在alligator函数内部使用它,而无需将其分配给返回的对象。

扫码关注云+社区

领取腾讯云代金券