Object.create против .prototype
(Закройте дубликат IF)
Учитывая следующий сценарий:
function Person(first, last) {
this.name = {
first,
last
};
};
Person.prototype.greeting = function() {
console.log('Hi! I\'m ' + this.name.first + '.');
};
function Teacher(first, last, subject) {
Person.call(this, first, last);
this.subject = subject;
}
//Teacher.prototype = Person.prototype;
//Teacher.prototype = Object.create(Person.prototype);
Teacher.prototype.constructor = Teacher;
const t = new Teacher('John','Smith','Math');
В чем разница использования этого?
Teacher.prototype = Person.prototype;
or this
Teacher.prototype = Object.create(Person.prototype);
1 ответ
Если вы используете простой метод присваивания, изменится на Teacher.prototype
также повлияет Person.prototype
. Это не очень хорошая идея, потому что, хотя учитель - это личность, личность не обязательно является учителем:
function Person(first, last) {
this.name = {
first,
last
};
};
Person.prototype.greeting = function() {
console.log('Hi! I\'m ' + this.name.first + '.');
};
function Teacher(first, last, subject) {
Person.call(this, first, last);
this.subject = subject;
}
// Bad:
Teacher.prototype = Person.prototype;
// Because:
Teacher.prototype.teachesClass = () => true;
// Person.prototype now has that too:
const p = new Person();
console.log(p.teachesClass());
Теперь оба .prototype
s одинаковы, поэтому любые мутации одного будут влиять на другой. Это совсем не то, что вам нужно.
Напротив, когда вы используете Object.create
метод, присвоения Teacher.prototype
только повлияет Teacher.prototype
. Объект, которыйTeacher.prototype
наследуется от, Person.prototype
, не будет изменено:
function Person(first, last) {
this.name = {
first,
last
};
};
Person.prototype.greeting = function() {
console.log('Hi! I\'m ' + this.name.first + '.');
};
function Teacher(first, last, subject) {
Person.call(this, first, last);
this.subject = subject;
}
// Good:
Teacher.prototype = Object.create(Person.prototype);
// Because:
Teacher.prototype.teachesClass = () => true;
// Person.prototype does not have teachesClass
const p = new Person();
console.log(p.teachesClass);
Посмотрим на цепочку прототипов:
Teacher.prototype = Person.prototype;
// You get:
Teacher.prototype <- Object.prototype
Person.prototype <- Object.prototype
Teacher.prototype === Person.prototype // (same object)
// Compare to
Teacher.prototype = Object.create(Person.prototype);
// You get:
Teacher.prototype <- Person.prototype <- Object.prototype