добавить метод в прототип - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующий код

const humanUtils  = {
  sayRace: function(){
    console.log('Im a '+ this.race);
  }
}

function human() {
  const human = Object.create(humanUtils);
  human.race = 'human';
  return human;
}

const manUtils = Object.create(humanUtils);

function man() {
  const createMan = new human();
  createMan.gender = 'man';
  return createMan
}

function woman() {
    const createWoman = new human();
    createWoman.gender = 'woman';
    return createWoman;
}

const mankind = new human();
const adam = new man();
const eve = new woman();

Я бы хотел добавить метод к manUtils (), который будет доступен только мужчине, а не человеку и женщине, например, я могу вызвать man.foo ().

Как я могу заставить конструктор man () указывать на manUtils и все еще получать доступ к функциям humanUtils, чтобы я мог вызывать adam.sayRace() и adam.foo(), унаследованные от manUtils?

я не хочу использовать новый класс es6 и традиционное переназначение прототипа ( mdn ) ... если это возможно

1 Ответ

0 голосов
/ 03 июля 2018

Есть ли причина для не помещения свойства race в humanUtils? Если нет, просто включите гонку, и вы можете заставить конструктор man() указывать на manUtils и по-прежнему получать доступ к функциям humanUtils, написав

function man() {
  return Object.create(manUtils)
}

И затем, если вы хотите добавить метод к manUtils, просто напишите manUtils.fancyNewMethod = yourNewMethod

Записка о new

В вашем примере нет смысла использовать оператор new для построения человечества, Адама и Евы. Когда вы пишете new human, создается новый объект (давайте назовем его A для справки) с прототипом human.prototype (который является пустым объектом, поскольку вы не хотите переназначать humanUtils на human.prototype ), а затем human выполняется с this, привязанным к A. Но внутри вашего human конструктора вы отбрасываете A и вместо этого создаете свой собственный объект, используя Object.create(humanUtils).

Полный пример

const humanUtils = {
  sayRace() {
    console.log('Im a '+ this.race);
  },
  race: 'human'
}

function human() {
  return Object.create(humanUtils);
}

const manUtils = Object.create(humanUtils, {
  gender: { value: 'man' }
});

function man() {
  return Object.create(manUtils)
}

function woman() {
    const createWoman = new human();
    createWoman.gender = 'woman';
    return createWoman;
}

const mankind = human();
const adam = man();
const eve = woman();

console.log(adam.gender)
adam.sayRace()
console.log('humanUtils isPrototypeOf adam:', humanUtils.isPrototypeOf(adam))
console.log('manUtils isPrototypeOf eve:', manUtils.isPrototypeOf(eve))

manUtils.saySlogan = function() {console.log('men are cool because they have a slogan')}

adam.saySlogan()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...