Класс и прототип. Как начинающий интерпретирует их?

Исходя из C++, ява-я немного понимаю о классах. Но замена классов прототипом (как в javascript) кажется совершенно другим процессом мышления. Это может быть действительно трудно понять для таких новичков, как я, поэтому я покажу свое собственное наблюдение, к которому я пришел после некоторой деконструкции.

Классы в javascript - это относительно новая концепция, и от программистов из java-фона лучше было бы объяснить объяснение так, как они знакомы. Пожалуйста, просветите меня, так как я должен ошибаться, пропустить важные моменты, будучи новичком сам.

2 ответа

Наследование прототипа:

Объект может быть прототипом для другого объекта. Мы можем сделать это с помощью свойства prototype ( [[proto]]):

var parent={
  name:"example"
}

var child={
  age:16
}

Object.setPrototypeOf(child,parent);

Но почему полезны прототипы? Давайте рассмотрим два случая:

  1. Мы устанавливаем свойство объекта:

    1. Свойство добавляется к этому объекту
  2. Мы пытаемся получить значение определенного свойства:

    1. Проверить, имеет ли текущий объект это свойство, если да, вернуть его значение, если не продолжить

    2. Текущий объект установлен в прототип объекта, повторите с шагом 1

    3. Если тип Object.prototype не определен (мы достигли какого-то глобального объекта), возвращается undefined

Теперь давайте возьмем верхний код в качестве примера:

  child.name;//"example" as its part of the prototype
  child.age;//its own property
  parent.name;//"example"
  parent.age;//undefined

И когда мы устанавливаем свойство:

child.name="child";
child.name;//child
parent.name//example

Так вот как наследование в основном работает. Это легко и не слишком сложно. Чтобы создать экземпляр, мы можем использовать Object.create или мы можем использовать setPrototypeOf, как показано в верхнем примере (он довольно новый):

var child=Object.create(parent);//creates a new empty object with parent as prototype

Продвинутый прототип:

Но чего не хватает в верхнем коде? Ну, мы хотим конструкторов! Таким образом, мы могли бы просто создать функцию, которая собирает объект (называемый фабричной функцией) с набором прототипов:

function createChild(age){
   var child=Object.create(parent);
   child.age=age;
}

var child=createChild(15);

У него есть одна проблема: что, если мы хотим ребенка ребенка?

var thomasProto=Object.create(createChild(age));
thomasProto.name="Thomas";
function createThomas(age,someother){
   var instanceofThomas=Object.create(thomasProto);
   //how do we set age ?
   child.someother=someother
}

Однако это не так просто, поэтому был представлен новый конструктор.

Это так:

  1. Создайте новый объект с функцией.prototype в качестве прототипа

  2. Вызов функции с этим новым объектом

3: вернуть новый объект

например:

function parent(){
   this.some="test";
}
parent.prototype={
   name:"example";
}

var child=new Parent();
child.some;//own value test
child.name;//inherits from parent.prototype

Прототип цепочки это:

child -> parent.prototype -> Object -> null

Наследование классов в JS

В JS нет наследования классов. Существует только синтаксис класса, который обеспечивает другой способ создания наследования прототипа.

Вот мои наблюдения. Просветите меня, так как в настоящее время мне не хватает знаний, и мне нужно стать лучше.


УЧЕБНЫЙ КЛАСС:

1. Состоит из функций и переменных.

2. Их содержимое может быть унаследовано с помощью ключевого слова "extension".

3. У нас есть родительский класс, дочерние классы.

4. Объект - это нечто, созданное с помощью конструктора (т.е. функции).

5. Объект наследует все полномочия класса, из которого пришел конструктор.

6. Объект наследует способность создавать переменные, функции, присутствующие в классе.

7. Объект может наследовать полномочия другого класса, то есть класса, отличного от своего собственного благодетеля (= класс).

8. Класс сам по себе не имеет власти - его можно хорошо описать как просто имя, данное "группе людей" или цивилизации. Название необходимо только по дипломатическим причинам, например: "расширение". Кроме этого, вся сила делать что-либо существует с переменными, функциями.


прототип:

1. Прототип - это объект-> объект, изначально принадлежащий функции Object. Да,"В начале была" только одна функция ", и все остальные функции JavaScript произошли от него.

2.Функция также может быть "конструктором", и ее часто называют "встроенным объектом".

3. Метод - это не что иное, как переменная / свойство / объект в сочетании с функцией.

4. Прототип - это просто свойство, которое содержит функции, больше свойств. Таким образом, свойство становится "больше, чем просто свойство"- оно становится объектом.

5. Но этот объект "прототип" особенный, видите ли. Мудрый старый Объект предоставляет его всем встроенным, определяемым пользователем функциям, объектам для свободного владения его содержимым и мощностью наследования.

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