Сохранение собственных свойств в частном порядке с составом объекта - PullRequest
0 голосов
/ 01 апреля 2019

я просматривал блог о составе объектов , и он показывал этот код здесь:

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 возвращалось неопределенным.Я предполагаю, что для этого потребуется закрытие, но я не уверен в лучшем / самом чистом способе сделать это или просто в обычном способе, которым это делается.

Я понимаю, что вы не могли просто передать себя объекту object.assign,но что, если у вас есть смесь переменных, которые вы хотите, чтобы некоторые были частными, а некоторые - публичными?Я бы подумал, что решение здесь будет иметь литерал 'state' со всеми закрытыми переменными и литерал 'base', который имеет все публичные переменные, если вы хотите получить доступ к чему-либо в базовом литерале, который вам затем потребуется использоватьэто в других объектах в objects.assign.

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Каждая внутренняя функция, которая использует .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();
0 голосов
/ 01 апреля 2019

Только не передавайте name в self в первой строке alligator. Вы все еще можете использовать его внутри функции alligator, не назначая его возвращаемому объекту.

...