Является ли создание экземпляра объекта на самом деле просто наследование в некотором роде в JavaScript? - PullRequest
4 голосов
/ 18 июня 2011

Я читал книгу по JavaScript и, читая главу о наследовании, мне стало интересно, действительно ли каждый раз, когда вы создаете экземпляр объекта, происходит ли наследование, особенно если они похожи.

Примеры: создание прототипа - someObject.prototype = new someOtherObject();

Создание объекта var myArray = new Array()

Похоже, верно?

Кроме того, в книге (JavaScript для веб-разработчиков, автор: Николас Закас) указывается, что существует связь между экземпляром и прототипом конструктора (ссылка обычно называется __proto__)

Так можно ли утверждать, что создание объекта похоже на наследование?

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Нет. Вы сбиты с толку, потому что один из методов выполнения наследования (а именно наследование прототипа) принимает в качестве прототипа данный объект. И один из способов получения объектов - через конструкторы.

Другими словами, в 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».

1 голос
/ 18 июня 2011

Без использования objectType.inherits (), если я понял вашу концепцию наследования, то это будет, если вы выберете только правильную часть:

new someOtherObject()

Это создание экземпляра некоторого другого объекта.

Что происходит здесь, вы создаете объект типа someOtherObject, который наследует структуру от пустого объекта (при условии, что вы не установили прототип для этого). Поскольку значением по умолчанию для прототипа является пустой объект {}.

Вы помещаете этот объект как прототип someObject:

someObject.prototype = new someOtherObject();

Теперь, если вы создадите экземпляр некоторого объекта, это произойдет:

Вы создаете someObject, который наследует структуру someOtherObject в тот момент времени, который наследует структуру (пустого) объекта, когда он был создан.

Возможно, лучшее объяснение состоит в том, что экземпляр расширяется за счет структуры своего прототипа в тот момент времени и оставляет все наследующие формулировки в стороне, поскольку простое использование этого может ввести в заблуждение. Поскольку классическое наследование использует базовые классы (типы), а прото использует их экземпляры. Теперь все зависит от того, как вы смотрите на наследование, о котором спорить не существует вообще в javascript (типы объектов являются изменяемыми во время выполнения), так как Карл Маркс утверждает, что реальный коммунизм вообще невозможен в концепции. Если вы согласны с этим последним утверждением, то сравнивать и спрашивать об этом не имеет значения, потому что ни в одном случае.

...