Что такое “новое” ключевое слово в JavaScript?
Ключевое слово new в JavaScript может быть довольно запутанным, когда оно впервые встречается, поскольку люди склонны думать, что JavaScript не является объектно-ориентированным языком программирования.
- Что это такое?
- Какие проблемы он разрешает?
- Когда это подходит, а когда нет?
Он делает 5 вещей:
- Он создает новый объект. Тип этого объекта – просто объект.
- Он устанавливает этот новый объект как внутреннее, недоступное, [[prototype]] (т. Е. Свойство __proto__) как конструкторную функцию внешнего, доступного, прототипа объекта (каждый объект функции автоматически имеет свойство прототипа).
- Это делает this переменную точкой для вновь созданного объекта.
- Он выполняет функцию конструктора, используя вновь созданный объект, когда this упоминается.
- Он возвращает вновь созданный объект, если только функция-конструктор не возвращает ссылку на null объект non-. В этом случае вместо этого возвращается эта ссылка на объект.
Примечание: функция конструктора ссылается на функцию после new ключевого слова, как в
Когда это будет сделано, если запрашивается неопределенное свойство нового объекта, скрипт проверит объект object [[prototype]] для свойства. Вот как вы можете получить что-то похожее на традиционное наследование классов в JavaScript.
Самая сложная часть этого вопроса – это номер 2. Каждый объект (включая функции) имеет это внутреннее свойство, называемое [[prototype]]. Он может быть установлен только при создании объекта, либо с новым, с Object.create, либо на основе литерала (функции по умолчанию – Function.prototype, числа – Number.prototype и т.д.). Его можно прочитать только с Object.getPrototypeOf(someObject). Нет другого способа установить или прочитать это значение.
Функции, помимо скрытого свойства [[prototype]], также имеют свойство, называемое прототипом, и именно это вы можете получить и изменить для предоставления унаследованных свойств и методов для объектов, которые вы создаете.
Это похоже на наследование классов, потому что теперь любые объекты, new ObjMaker() вами с использованием new ObjMaker() , также, похоже, унаследовали свойство “b”.
Если вы хотите что-то вроде подкласса, то вы делаете это:
Я прочитал тонну мусора на эту тему, прежде чем, наконец, найдя эту страницу, где это очень хорошо объясняется хорошими диаграммами.