Класс и прототип. Как начинающий интерпретирует их?
Исходя из C++, ява-я немного понимаю о классах. Но замена классов прототипом (как в javascript) кажется совершенно другим процессом мышления. Это может быть действительно трудно понять для таких новичков, как я, поэтому я покажу свое собственное наблюдение, к которому я пришел после некоторой деконструкции.
Классы в javascript - это относительно новая концепция, и от программистов из java-фона лучше было бы объяснить объяснение так, как они знакомы. Пожалуйста, просветите меня, так как я должен ошибаться, пропустить важные моменты, будучи новичком сам.
2 ответа
Наследование прототипа:
Объект может быть прототипом для другого объекта. Мы можем сделать это с помощью свойства prototype ( [[proto]]):
var parent={
name:"example"
}
var child={
age:16
}
Object.setPrototypeOf(child,parent);
Но почему полезны прототипы? Давайте рассмотрим два случая:
Мы устанавливаем свойство объекта:
- Свойство добавляется к этому объекту
Мы пытаемся получить значение определенного свойства:
Проверить, имеет ли текущий объект это свойство, если да, вернуть его значение, если не продолжить
Текущий объект установлен в прототип объекта, повторите с шагом 1
Если тип 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
}
Однако это не так просто, поэтому был представлен новый конструктор.
Это так:
Создайте новый объект с функцией.prototype в качестве прототипа
Вызов функции с этим новым объектом
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. Но этот объект "прототип" особенный, видите ли. Мудрый старый Объект предоставляет его всем встроенным, определяемым пользователем функциям, объектам для свободного владения его содержимым и мощностью наследования.