На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> реализация закрытых свойств в классах , ECMAScript 6
    Привествую коллеги :D, осваиваю современный JavaScript, дошел я наконец до ES6!
    штука скажу вам приятная, но без ES3/ES5 думаю освоение ES6 не было бы полным, поскольку больше половины средств является сахаром :D
    Зацените мой класс Person, все верно я написал? В частности свойства ведь закрыты так?
    ExpandedWrap disabled
      const Person = (function(){
          const
              _name = Symbol(),
              _age = Symbol(),
              _friends = Symbol();
       
          class Person {
              constructor({ name, age, friends = [] }){
                  this[_name] = name;
                  this[_age] = age;
                  this[_friends] = friends;
              }      
              get name(){
                  return this[_name];
              }
              get age(){
                  return this[_age];
              }  
              addFriend(friend) {
                  this[_friends].push(friend);
              }
              toString(){
                  const len = this[_friends].length;
                  let s = this[_friends].map(friend => friend.name).join(", ");          
                  
                  if (len > 0) {
                      s += (len !== 1) ? " are friends." : " is a friend.";
                  }
                  return `${this[_name]} is ${this[_age]} years old. ${s}`;
              }
          }
       
          return Person;
      }());
       
      const shelby = new Person({ name: "Shelby", age: 27 }),
          gregory = new Person({ name: "Gregory", age: 42 });
       
      gregory.addFriend(shelby);
      gregory.name = "";  //<-- свойство name только для чтения
      gregory.age = 0;
      gregory._name = ""; //<-- свойства _name не существует (на самом деле после этой операции оно будет создано, но оно никак не влияет на наше свойство name)
      gregory._age = 0;
      console.log(gregory.toString());  // "Gregory is 42 years old. Shelby is a friend."
    Сообщение отредактировано: Cfon -
      :wacko: ох и перепадёт тебе от @Serafim-а...
        Цитата K313 @
        :wacko: ох и перепадёт тебе от @Serafim-а...

        да кто он такой?! :lool:

        ну признайся я крут да? нормально замутил :blush:
        вроде задействовал всю мощь ES6 или где еще можно подрихтовать? :D
        Сообщение отредактировано: Cfon -
          сам все порешал :D
          перл от Гения :blush:
          ExpandedWrap disabled
            const Person = (function(){    
                const properties = new WeakMap();
                
                class Person {
                    constructor({name, age, friends = []}){        
                        properties.set(this, { name, age, friends });          
                    }      
                    get name(){
                        return properties.get(this).name;
                    }
                    get age(){
                        return properties.get(this).age;            
                    }  
                    addFriend(friend) {
                        properties.get(this).friends.push(friend);          
                    }
                    toString(){
                        const props = properties.get(this),
                            len = props.friends.length;            
                        let s = props.friends.map(friend => friend.name).join(", ");
                        
                        if (len > 0) {
                            s += (len !== 1) ? " are friends." : " is a friend.";
                        }          
                        return `${props.name} is ${props.age} years old. ${s}`;        
                    }
                }
             
                return Person;
            }());

          книжки читайте! :punish: :D

          пс. для админов! сделайте подсветку кода ES6! на дворе 2017 год! :whistle:
          Сообщение отредактировано: Cfon -
            Cfon ты почти обрёл просветление, прошло всего пол года, маладес (sic!) ...только забыл, что "(function(){})" не нужен, ибо модуль и так всё инкапсулирует, а наверх надо прокидывать через export. Но поздравляю, ты уже добрёл до понимания: обращение к переменным объекта (сообщение #3720191)

            Добавлено
            Цитата Cfon @
            на дворе 2017 год!

            В таком случае логично сделать подсветку ES8, ты так не считаешь? :huh:

            Добавлено
            Цитата Cfon @
            да кто он такой?!

            Хрен с горы, забей на него+
            Сообщение отредактировано: Serafim -
              Цитата Serafim @
              Cfon ты почти обрёл просветление, прошло всего пол года, маладес (sic!) ...только забыл, что "(function(){})" не нужен, ибо модуль и так всё инкапсулирует, а наверх надо прокидывать через export.

              IIFE тут я юзаю для скрытия констант Symbol :)

              Цитата Serafim @
              Цитата Cfon @
              на дворе 2017 год!

              В таком случае логично сделать подсветку ES8, ты так не считаешь? :huh:

              Не возражаю пускай будет ES8 :D

              Цитата Serafim @
              Цитата Cfon @
              да кто он такой?!

              Хрен с горы, забей на него+

              :D :D
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,1913 ]   [ 16 queries used ]   [ Generated: 29.03.24, 00:39 GMT ]