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

Keeping self properties private with object composition

我是 looking at a blog on object composition 它在这里显示了这段代码:

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 alligator时,你当然可以访问jack上的名字属性。如果我希望这个 属性 是私有的,那么 jack.name 返回未定义的。我假设这需要关闭,但不确定 best/cleanest 的方式,或者只是传统的方式。

我知道您不能将 self 传递给 object.assign,但是如果您在 self 中混合了一些变量,您希望其中一些变量是私有的,而另一些变量是 public 怎么办?如果您想访问基本文字,然后您需要在 objects.assign.

中的其他对象中使用它

每个使用 .name 的内部函数都是 传递 self 在构造对象时明确地,所以你可以 return

Object.assign({}, ...

而不是

Object.assign(self, ...

并且 returned 对象将没有 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();

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