Прототипное наследование в JavaScript

Я смотрел выступления Дугласа Крокфорда в YUI Theater, и у меня есть вопрос о наследовании JavaScript ...

Дуглас приводит этот пример, чтобы показать, что «Hoozit» наследуется от «Gizmo»:

function Hoozit(id) {
    this.id = id;
}
Hoozit.prototype = new Gizmo();
Hoozit.prototype.test = function (id) {
    return this.id === id;
};

Почему он пишет Hoozit.prototype = new Gizmo() вместо Hoozit.prototype = Gizmo.prototype?

Есть ли разница между этими двумя?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
8
0
1 047
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Причина в том, что использование Hoozit.prototype = Gizmo.prototype будет означать, что изменение объекта-прототипа Hoozit также изменит объекты типа Gizmo, что не является ожидаемым поведением.

Hoozit.prototype = new Gizmo() наследуется от Gizmo, а затем оставляет Gizmo в покое.

Но вы можете использовать косвенное (паразитное наследование), если не хотите вызывать конструктор.

Rob 29.10.2009 17:11

Если он напишет Whoozit.prototype = Gizmo.prototype, любая модификация, которую он внесет позже в прототип Hoozit, будет отражена в прототипе Gizmo.

В дополнение к ответу Триптиха: экземпляры Hoozit также наследуют все свойства экземпляра Gizmo, а не только те, которые определены в прототипе; например:

function Gizmo() {
    this.foo = 'bar'; // foo is visible in every Hoozit instance
}

Другие ответы касаются этого, но если вы действительно хотите унаследовать прототип, вы можете использовать некоторую паразитическую магию:

Object.prototype.inherit = function(p) {
    NewObj = function(){};
    NewObj.prototype = p;
    return new NewObj(); 
};

// Paraphrasing of Nicholas Zakas's Prototype Inheritance helper
function inheritPrototype(subType, superType) {
    var prototype = Object.inherit(superType.prototype);
    prototype.constructor = subType;
    subType.prototype = prototype;
};

Теперь вы можете заменить:

Hoozit.prototype = new Gizmo();

с участием

inheritPrototype(Hoozit, Gizmo);

Это может не стоить хлопот, если у вас нет настоящего большого конструктора Gizmo (единственная победа в моем предложении состоит в том, что вам не нужно вызывать конструктор Gizmo для подключения прототипа). У меня есть примеры многих из этих типов паттернов в Примеры TDD JavaScript.

Другие вопросы по теме