Цель: наследовать только ключи объекта, а не те, которые унаследованы
Два конструктора: Персона и Учитель.Учитель наследует свойства, используя прототип наследования.
Рост и вес - это два ключа, унаследованных от человека к учителю.
Насколько я понимаю, ... in проходит через все ключи объекта, а также ключи, унаследованные.Поэтому hasOwnProperty используется для фильтрации свойств, доступных только внутри объекта Teacher.Однако код выводит все свойства, включая рост и вес, которые он не должен.
/* eslint-disable no-console */
function Person(first, last, age, gender, interests, weight, height) {
this.name = {
first,
last,
};
this.age = age;
this.gender = gender;
this.interests = interests;
this.weight = weight;
this.height = height;
}
Person.prototype.greeting = () => {
console.log(`Hi! I'm ${this.name.first}.`);
};
function Teacher(first, last, age, gender, interests, subject) {
Person.call(this, first, last, age, gender, interests);
this.subject = subject;
}
Teacher.prototype.greeting = () => {
let prefix;
if (this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') {
prefix = 'Mr.';
} else if (this.gender === 'female' || this.gender === 'Female' || this.gender === 'f' || this.gender === 'F') {
prefix = 'Mrs.';
} else {
prefix = 'Mx.';
}
console.log(`Hello. My name is ${prefix} ${this.name.last}, and I teach ${this.subject}.`);
};
Teacher.prototype = Object.create(Person.prototype);
Object.defineProperty(Teacher.prototype, 'constructor', {
value: Teacher,
enumerable: false, // so that it does not appear in 'for in' loop
writable: true,
});
const teacher1 = new Teacher('Dave', 'Griffiths', 31, 'male', ['football', 'cookery'], 'mathematics');
for(var key in teacher1){
if(teacher1.hasOwnProperty(key)){
console.log(key);
}
}
// Output: name, age, gender, interests, weight, height, subject
// weight and height should not be here