Расскажите о дизайнерских идеях языка javascript.

JavaScript
Расскажите о дизайнерских идеях языка javascript.

Для какого шаблона проектирования разработан язык javascript?

Как фронтенд-инженер я считаю, чтоjavascriptМастерство — важный навык, так сколько же шаблонов проектирования вы знаете? Какие шаблоны проектирования вы знаете? Во-первых, нам нужно знать, что шаблоны проектирования неjavascriptУникальный режим, во многих языках есть режимы дизайна, поэтому режим дизайна - это идея программирования, режим дизайнаDesign pattern)Представляет наилучший вариант осуществления, эти шаблоны обычно используются в объектно-ориентированных программированных опытных программистах,设计模式Это решение для разработчиков программного обеспечения, когда они сталкиваются с проблемами программирования. Эти решения будут проверены и улучшены многими отличными программистами. Это эволюционный процесс отличных идей. Утверждено, и таким образом родился шаблон проектирования.

Вот что Википедия говорит о шаблонах проектирования:

Шаблон проектирования — это набор повторно используемых, наиболее известных, классифицированных сводок опыта проектирования кода. Цель использования шаблонов проектирования: повторное использование кода, упрощение понимания кода другими и обеспечение надежности кода. Шаблоны проектирования делают программирование по-настоящему инженерным; шаблоны проектирования являются краеугольным камнем разработки программного обеспечения, как структура здания.

Классификация шаблонов проектирования

существует<设计模式>В одной книге собраны 23 шаблона проектирования, которые можно разделить на:творческий режим,структурный образец,поведенческая модель.

братьтворческий режимДругими словами, создание объекта — это абстрактное поведение, и конкретный создаваемый объект может быть изменен, поэтому цель режима создания — инкапсулировать изменения этих объектов. а такжеструктурный образецЭто отношение композиции между инкапсулированными объектами.поведенческая модельИнкапсуляция — это изменение объекта.

творческий режим: шаблон Singleton, абстрактный шаблон factory, шаблон строителя, шаблон factory, шаблон прототипа.
Структурный образец: режим адаптера, режим моста, режим украшения, режим композиции, режим внешнего вида, режим легковеса, режим прокси.
поведенческая модель: шаблон метода шаблона, шаблон команды, шаблон итератора, шаблон наблюдателя, шаблон посредника, шаблон меморандума, шаблон интерпретатора (шаблон интерпретатора), шаблон состояния, шаблон стратегии, шаблон цепочки ответственности (шаблон цепочки ответственности), шаблон посетителя.

Шаблон прототипа и объектная система JavaScript на основе наследования прототипов

чтобы понятьjavascriptдизайн-мышление, мы должны понимать его историю, вBrendan EichПри разработке объектно-ориентированной системы javascript мы узнали изSelfа такжеSmalltalkЭти два основаны на языках-прототипах. такjavascriptДизайн языка также принимает эту идею, используя шаблон проектирования врежим прототипа.

  • Шаблон прототипа — это не просто шаблон, он также известен как парадигма программирования.

Использовать режим клонированного прототипа

С точки зрения шаблонов проектирования шаблон прототипа — это шаблон для создания объектов.В отличие от статических языков, когда мы создаем объект, мы не указываем сначала его тип, а затем создаем объект.Шаблон прототипа использует Существует другой способ, способ клонирования. Нам больше не нужно обращать внимание на тип объекта, нам нужно клонировать идентичный объект до тех пор, пока он нам нужен Это шаблон прототипа.

Итак, поскольку шаблон прототипа создает объекты путем клонирования, если нам нужен объект, точно такой же, как объект, мы можем использовать шаблон прототипа.

Именно эта характеристика определяетрежим прототипаКлюч к реализации зависит от того, поддерживает ли язык клонирование и обеспечивает ли онcloneметод.ECMAScript 5Он предоставляет метод **Object.create()**, который можно использовать для клонирования объектов следующим образом:

var Person = function(){
  this.name = 'Snine',
  this.age = 22,
  this.height = 173
} 
var person = new Person();
person.name = '小王';
person.age = 25
person.height = 175
let clonePerson = Object.create(person)
console.log(person.name)
console.log(person.age)
console.log(person.height)

Клонирование — это способ создания объектов

мы знаемрежим прототипаТаким образом можно клонировать идентичный объект, но настоящая цель шаблона прототипа не в получении такого объекта, а в предоставлении таких удобных средств для создания определенного класса.Клонирование — это только процесс и средство создания этот класс. . Во многих статических языках, таких какJavaТребования к типам очень строгие, что приводит нас кnewТакая операция будет очень жесткой и негибкой, и для решения этой проблемы потребуется дополнительный код, относительноjavascriptОн становится очень гибким, нам не нужно заботиться о конкретном типе объекта, как маленький мальчик, указывающий на самолет и говорящий: «Я хочу это», мне не нужно знать, что это такое, но я может понять, что это такое, поэтому вjavascriptЭтот тип языка, создание объектов очень просто, нет проблем с соединением, с точки зрения режима проектирования значение режима прототипа невелико, ноJavaScript сам по себе является объектно-ориентированным языком программирования, основанным на прототипах.,этоОбъектная система построена по шаблону прототипа., мы называем егоПарадигма прототипного программирования может быть более подходящей.

Прототип механизма делегирования на основе цепочки

Представим такой сценарий, есть такой класс, класс животныхAniam, сначала для создания этого класса нам нужноcloneОбъект, а затем все они имеют одинаковую способность есть под этим классом, так чтоAniamВсе, что вы можете съесть, давайте создадим еще один объект в это времяDog, он может не только что-то делать, но и издавать звуки, поэтому есть три класса, для представления которых мы используем код:

var Aniam = new Object()
Aniam.eat = function(){
  this.Aniam = function(){ congsole.log('我可以吃东西了')}
}
var Dog = Object.create(Aniam)
Dog.say = function(){ console.log('我可以叫出声了') }

console.log(Dog.say())
console.log(Dog.eat())

Приведенный выше код представляет такой процесс, поэтому можно ли найти связь?Аниам происходит от Объекта, СОБАКА происходит от АниамаТакие отношения слой за слоем. Проще говоря, мы понимаем их как abc, b происходит от a, а c происходит от b. И наоборот, a рождает b, b рождает c, а c может продолжаться. образуя могущественное царство животных, можем ли мы понять взаимосвязь здесь?

В это время представим, что Пес, предмет, щенок сам может есть, и теперь он хочет издать звук, но сам не имеет возможности сказать ().Просто помогите щенку выполнить эту операцию, я есть ваши способности, я могу сделать это сам, но вы можете сделать это для меня, а если у Аниам этого нет, то продолжайте Шанлуо, я верю всемjavascriptЦепочка прототипов не является чем-то необычным, но то, о чем мы здесь говорим,режим прототипаЭто тип мышления, так что вы понимаете это? Давай закругляться, а?

Основная парадигма шаблона прототипа

  • Все данные являются объектами.
  • Чтобы получить объект, вместо создания экземпляра класса найдите объект и клонируйте его как прототип.
  • Субъект будет помнить свои принципы
  • Если объект не может ответить, он делегирует запрос своему прототипу

Прототипирование наследования в JavaScript

Ну, мы сделали вывод вышережим прототипаОсновная парадигма, что вы думаетеJavaScriptСледили ли вы, давайте обсудим, как JavaScript строит свой собственный на основе этих правилсистема объектов

​ 1. Все данные являются объектами

JavaScriptПри проектировании подражайтеJavaВведены два набора механизмов:базовый тип данных,Тип ссылочных данных (тип объекта), с этой точки зрения он не очень хорошая идея, по мнениюJavaScriptОригинальная дизайнерская идея, помимоUndefinedВсе, кроме должно быть объектами.Для достижения этой цели основные типы данных, такие как число, логическое значение и строка, также могут быть переданы черезКласс упаковкиупакован как объект,

​ Итак, мы не можем сказать, что JavaScript состоит исключительно из объектов, но мы можем сказать, что большая его часть состоит из объектов, поэтому я считаю, что вJavaScriptВ прототипе также есть корневой объект, как и деление, у клонированного родителя тоже есть источник, собственно, вJavaScriptКорневой объект в является пустым объектомObject.prototype, мы видим вездеJavaScriptвсе исходит из этого,

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

вJavaScriptЯвного действия клонирования мы не видим, разве оно не следует за ним? Нет, поскольку это внутренняя реализация движка, нам не нужно заботиться о деталях клона, нам нужен только вызов дисплея var obj = new Object()Или var obj2 = {}, в этот момент движок возвращается и клонируетObject.prototypeНе беспокоясь, давайте взглянем на следующий код:

function Person( name ) {
  this.name = name
};
Person.prototype.getName = function () {
  return this.name
}
var people = new Person('Snine')
console.log(people.name); 
console.log(people.getName())

Во-первых, нам нужно объяснить, что вJavaScriptВ Java нет понятия класса В отличие от Java, который является объектно-ориентированным языком, в нем нет понятия класса или интерфейса, то есть он не может определять абстрактные классы или реализовывать наследование. Однако для удобства программирования мы имитируем поведение классов и наследования, то есть конструкторов.Конструктор — это функция с набором свойств и поведений в качестве тела функции, а значения могут передаваться через параметры функции . Это эквивалентно конструктору класса в Java, при необходимости вы можете имитировать создание объектов через new.

​ 3: Объект запомнит свой прототип

Итак, здесь Person не класс, а конструктор, первый вJavaScript, функцию можно использовать напрямую или она может быть New, когда она новая, это конструктор,При использовании оператора new для вызова функции фактически происходит сначала клонирование объекта Object.prototype, а затем выполнение некоторых дополнительных операций.. существуетchromeа такжеfirefoxПодождите, пока браузер покажет объект *proto * Свойство, мы можем найти объект-прототип через свойство, как только мы узнаем, когда объект не может работать определенным образом, он доверит выполнение своего прототипа, как он отправил свой запрос на загрузку собственного прототипа, это ___proto_ Атрибуты, вы можете найти родителя через этот скрытый атрибут.

​ 4: Если объект не может ответить на запрос, он делегирует запрос своему прототипу

Это правило является сутью наследования по цепочке прототипов.JavaScriptВ отличие от других объектно-ориентированных языков, он не клонирован из других объектов, фактически каждый из его объектов является производным отObject.prototypeЕсли это так, мы можем получить только одно отношение наследования, то есть прототип каждого объектаObject.prototype, что заведомо неразумно, поэтому хотя все объекты клонируются из корневого объекта, наш прототип не ограничиваетсяObject.prototype, мы можем динамически указывать на другие объекты.Когда объект a должен позаимствовать способность объекта b, я могу выборочно указать свой прототип на b, чтобы добиться эффекта наследования, например:

var A = function(){}
A.prototype = {name:'Snine'}

var B = function(){}
B.prototype = new A();

var b = new B();
console.log(b.name)   //输出 Snine

Мы определяем A, ab, добавляем атрибут имени к прототипу A, затем указываем прототип B на A, а затем переходим к новому b, затем, когда b собирается ввести имя, возвращаемся к своему прототипу B. , а прототип B указывает на A, поэтому мы идем к A, чтобы найти вывод атрибута имени, который представляет собой полную цепочку прототипов и отношение заимствования.

Суммировать

  • JavaScript — это язык, разработанный в режиме прототипа.
  • Любой объект в JavaScript создается изObject.prototypeклонированный
  • Связь между цепочкой прототипов JavaScript и свойствами указателя — это скрытое свойство _ _proto _ _.
  • Цепочка прототипов JavaScript не бесконечно длинна, она достигает только корневой начальной точки объекта.Object.prototype

расширять

Питер Новиг однажды сказал, что шаблоны проектирования являются дополнением к отсутствию языка.Если вы хотите использовать шаблоны проектирования, лучше найти лучший язык.

Шаблоны проектирования часто отражают неадекватность языков, но как разработчик веб-интерфейса я считаю, чтоJavaScriptЭто по-прежнему наш единственный выбор в течение длительного времени.Хотя мы не можем изменить язык, сам язык также развивается. Может быть, когда-нибудь вы обнаружите закономерность, присущую языку, напримерObject.createЭто то же самое, что естественное формирование режима-прототипа. использоватьObject.createОн может лучше отражать суть паттерна-прототипа, но эффективность создания объектов этим методом невысока, и обычно он медленнее, чем объекты, создаваемые конструктором. В то же время **Object.create(null)** может создать объект без прототипа.

Классы ES6

ECMAScript 6имеет новый синтаксис класса, который позволяетJavaScriptОн больше похож на язык, основанный на классах, но за ним объекты по-прежнему создаются через механизм прототипов. Классы, созданные через класс, такие же, как и раньше. В этой статье для анализа дома используется метод записи es5.JavaScriptНадеюсь, вы сможете лучше понять структуру этого языка.