0

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

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 上的 name 属性。如果我希望这个属性是私有的,那么 jack.name 返回未定义怎么办。我假设这需要关闭,但不确定最好/最干净的方法,或者只是传统的方法。

我知道你不能将 self 传递给 object.assign,但是如果你在 self 中有一个混合变量,你希望一些是私有的,一些是公共的?我原以为这里的解决方案是使用包含所有私有变量的“状态”文字和包含所有公共变量的“基本”文字,如果您想访问基本文字中的任何内容,则需要使用这在objects.assign 的其他对象中。

4

2 回答 2

1

每个使用 的内部函数.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();

于 2019-03-31T23:46:46.963 回答
0

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

于 2019-03-31T23:49:31.847 回答