通过对象组合来保持自身属性的私密性

时间:2019-03-31 23:43:22

标签: javascript oop 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");

当您访问杰克鳄鱼时,您当然可以访问杰克的name属性。如果我希望此属性为私有,那jack.name返回未定义怎么办。我以为这需要关闭,但不确定最好/最干净的方法,或者只是常规方法。

我了解到您不能将self传递给object.assign,但是如果您自己具有多个变量的混合体,而又希望它们是私有的而又又是一些公开的,那该怎么办?我以为这里的解决方案是拥有一个带有所有私有变量的“状态”文字和一个具有所有公共变量的“基本”文字,如果您想访问基本文字中的任何内容,则需要使用这在object.assign的其他对象中。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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