Есть ли причина для не помещения свойства 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()