Вы можете , но это будет означать, что когда вы присваиваете свойство Teacher.prototype
, вы будете мутировать Person.prototype
, что, вероятно, нежелательно.
// Works:
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
}
function Teacher(name) {
Person.call(this, name);
}
Teacher.prototype = Object.create(Person.prototype);
Teacher.prototype.teaches = function() {
return true;
}
const p = new Person('bob');
console.log(p.teaches()); // p.teaches is not a function, as expected and desired
Сравнить с
// Bad:
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
}
function Teacher(name) {
Person.call(this, name);
}
Teacher.prototype = Person.prototype;
Teacher.prototype.teaches = function() {
return true;
}
const p = new Person('bob');
console.log(p.teaches()); // `true`... oops, but bob is not a Teacher, bob is just a Person
Лучше использовать метод Object.create
, чтобы Teacher.prototype
(изначально, по крайней мере) был пустым объектом , свободным для мутации, который имеет внутренний прототип , указывающий на Person.prototype
.
Имейте в виду, что для реального кода (а не кода, используемого для мысленного эксперимента радипонимания языковой механики), вы можете избежать многих неприятностей и синтаксических помех, используя class
и ключевое слово extends
:
class Person {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
class Teacher extends Person {
teaches() {
return true;
}
}
const p = new Person('bob');
console.log(p.teaches()); // p.teaches is not a function, as expected and desired