Нет. Вы сбиты с толку, потому что один из методов выполнения наследования (а именно наследование прототипа) принимает в качестве прототипа данный объект. И один из способов получения объектов - через конструкторы.
Другими словами, в someObject.prototype = new SomeOtherObject()
нет ничего особенного. Вы могли бы также сделать
someObject.prototype = { myObjectLiteral: "isJustAsGoodAsYourConstructoredInstance" };
или даже someObject.prototype = false
. Две операции, в буквальном смысле слова, не имеют ничего общего друг с другом.
РЕДАКТИРОВАТЬ Чтобы обратиться к цитате ОП, найденной в его книге:
"Вспомните связь между
конструкторы, прототипы и
экземпляры: каждый конструктор имеет
прототип объекта, который указывает на
конструктор и экземпляры имеют
внутренний указатель на прототип. "
К сожалению, это в лучшем случае вводит в заблуждение, а в худшем - просто неправильно. Подумайте, что будет означать «каждый конструктор имеет объект-прототип, который указывает на конструктор». Это будет означать, что, например,
Array.prototype === Array
Function.prototype === Function
function CustomConstructor() { }
CustomConstructor.prototype === CustomConstructor
Но все эти операторы выводят false
, если вы наберете их в консоли.
Теперь рассмотрим «экземпляры имеют внутренний указатель на прототип». Это правда, но не соответствует терминологии, которую он использует. Что это значит:
var myProto = {};
function CustomConstructor() { }
CustomConstructor.prototype = myProto; // inherit from the myProto object.
var x = new CustomConstructor(); // x is an "instance"
Object.getPrototypeOf(x) === myProto; // Object.getPrototypeOf fetches the "internal pointer"
Но, как вы можете видеть, я не унаследовал использование конструктора, как я пытался указать выше. Создание объекта ни в коем случае не наследование. Просто свойство конструкторов prototype
- это то, как осуществляется наследование прототипа, точно так же, как классическое наследование достигается путем размещения extends BaseClass
после определения класса в Java. В свою очередь, это различие присутствует, поскольку прототипное наследование позволяет вам наследовать прототип экземпляр объекта , а не базовый класс .
В JavaScript Garden есть несколько хороших разделов, которые могут помочь, если вам нужна дополнительная информация. Соответствующими являются «Прототип», «Конструкторы» и «Оператор instanceof».