g1er / Andrew

0 stars 0 forks source link

Статические свойства static #11

Open IgorKulishov opened 6 years ago

IgorKulishov commented 6 years ago

Мы продолжим изучать классы и в этой главе рассмотрим оператор методов static. В следующей главе мы рассмотрим унаследование класса при помощи extends, далее операторы ES6 и на этом мы закончим наше предварительное знакомство с JavaScript ES6 и перейдем к TypeScript - непосредственному языку программирования Angular фреймворк.

оператор static

Как ты уже видел, что бы обращаться к свойствам и методам класса нужно сначала создать объект класса при помощи оператора new. Однако из этого правила есть и исключение для того что бы обратиться напрямую к свойству или методу класса без создания его копии нам необходимо внутри класса перед названием метода поставить оператор static. Рассмотрим несколько примеров: Пример 1-ый:

class User {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  //define static method
  static guestAlert() {
    alert("Гость Сайта!");
  }
};
//call static method directly w/o instantiating class "new User('a','b')"
User.guestAlert();

Пример 2-ой: Еще один пример обращения напрямую к методу через static:

class Menu {
  static get elemClass() {
    return "menu"
  }
}

alert( Menu.elemClass );

Как ты видешь мы используем сразу два оператора static get.

Пример 3-ий: В объектно-ориентированных языках существуют интересные конструкции, когда мы обращаемся к другим методам внутри класса и даже создаем копию объекта класса (instance) при помощи оператора new и выглядит это следущим образом (пример из книги https://learn.javascript.ru/es-class):

class User {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
 //define static method
  static createGuest(a, b) {
   //create class instance using constructor inside method of the class
    return new User(a, b);
  }
};
//обращение к статическому классу создает копию класса внутри статического метода
let user = User.createGuest("Гость", "Сайта");
// обращаемся к свойствам user за счет того что статический метод создал два свойства 
// и вернул их объекту за счет оператора return 

// вернет первое свойство
alert( user.firstName ); 
//вернет весь метод
alert( User.createGuest );
IgorKulishov commented 6 years ago

Напиши какие есть вопросы. Можешь добавить свои статические методы.

g1er commented 6 years ago

В целом конструкция мне понятна. Одна просьба есть. Сейчас, углубляясь в детали основных вещей, мне трудно понять применение на практике таких решений в виду отсутствия опыта. При дальнейшем описании тех или иных новшеств не мог бы ты сразу указывать, как или где или для чего используются описываемые вещи. Мне было бы легче углубляться в жизнь программирования, понимать не такие явные вещи и более глубокое устройство программного мира. Собственно, что касается static, то тут как раз вопрос. Мне кажется, что обращаться к методу напрямую проще. Так почему бы сразу не указывать static во всех создаваемых классах? И почему встроенные классы не наделены такой возможностью?

IgorKulishov commented 6 years ago

Классы это как базисный проект зданий. Сам же объект который создаётся при помощи оператора new можно сравнить с зданием, а внутри constructor мы определяем количество комнат, дверей, количество этажей. Когда мы создаём При помощи static ты можешь обращаться к самому проекту напрямую. В static можно хранить то что никогда не будет варьироваться от объекта к объекту. К примеру размер кирпича, сечение водопроводной трубы или методы кладки кирпича.

IgorKulishov commented 6 years ago

К static действительно проще обращаться когда у тебя небольшое приложение и мало классов и объектов, однако когда у тебя много классов (класс kitchen , shower, ) и каждый объект созданный от класса kitchen уникален то применять static можно только для общих методов и свойств , а к примеру тип мойки , холодильника и шкафа создавать при помощи конструктора.

IgorKulishov commented 6 years ago

Мы можем написать пример в твоем приложении.