На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> обращение к переменным объекта
    Доброго времени суток!

    скажите почему след код не выводит измененое имя и возраст?
    ExpandedWrap disabled
      var person = (function (name, age) {
          var
              $name = name,
              $age = age;
       
          return {
              name: $name,
              age: $age,
              setName: function (name) { $name = name;},
              setAge: function (age) { $age = age;}
          };
       
      })('Gregory', 42);
       
      person.setName('Miller');
      person.setAge(30);
       
      console.log(person.name);
      console.log(person.age);

    Выхлоп:
    ExpandedWrap disabled
      Gregory
      42


    а вот если через функции доступа то все пучком
    ExpandedWrap disabled
      var person = (function (name, age) {
          var
              $name = name,
              $age = age;
       
          return {
              getName: function () { return $name; },
              getAge: function () { return $age; },
              setName: function (name) { $name = name;},
              setAge: function (age) { $age = age;}
          };
       
      })('Gregory', 42);
       
      person.setName('Miller');
      person.setAge(30);
       
      console.log(person.getName());
      console.log(person.getAge());

    Выхлоп:
    ExpandedWrap disabled
      Miller
      30
    Сообщение отредактировано: Cfon -
        Да потому что не понятно на кой фиг так вообще писать. Чем тебе не подошёл вариант:
        ExpandedWrap disabled
          class Person {
            name = '';
            age = 0;
          }


        И зачем изобретать велосипед с замыканием контекста - вообще хз
          Цитата Serafim @
          Да потому что не понятно на кой фиг так вообще писать. Чем тебе не подошёл вариант:
          ExpandedWrap disabled
            class Person {
              name = '';
              age = 0;
            }


          И зачем изобретать велосипед с замыканием контекста - вообще хз

          я по книжке учу ;)
          хочу работать в стиле JavaScript без классов :)
          например:
          ExpandedWrap disabled
            // Модуль spa
            //
            var spa = (function ($) {
             
                var person = {
                    name: 'Gregory',
                    age: 42,
                    print: function (container) {
                        var s = '<h1>' + this.name + ', ' + this.age + '</h1>';
                        $(container).html(s);
                    }
                }
             
                person.name = 'Miller';
                person.age = 30;
             
                return { person: person }
             
            }(jQuery));
             
             
            // обращаемся к модулю spa, когда модель DOM будет готова
            //
            jQuery(document).ready(
                function () {
                    spa.person.print(jQuery('#spa'));
                }
            );

          красиво за душу берет :D
          мне бесклассовый подход JavaScript затянул собственно в JavaScript ;)
          ни типов ни классов тока объекты и ламбди я просто кайфую от JavaScript :lol:

          кстати тока в JavaScript я наконец понял что такое замыкания :D
          Сообщение отредактировано: Cfon -
            Цитата Cfon @
            красиво за душу берет :D
            мне бесклассовый подход JavaScript затянул собственно в JavaScript ;)

            То есть в стандарт эти самые классы добавляют, добавляют, а ты без них решил? :angry:
              Цитата Астарот @
              Цитата Cfon @
              красиво за душу берет :D
              мне бесклассовый подход JavaScript затянул собственно в JavaScript ;)

              То есть в стандарт эти самые классы добавляют, добавляют, а ты без них решил? :angry:

              да пускай добавляют я без них хочу :D
                тогда так:

                ExpandedWrap disabled
                  let Person = (function() {
                    function Person(name, age) {
                      this.name = name;
                      this.age = age;
                    }
                   
                    Person.prototype.setAge(age) {
                      this.age = age;
                    }
                   
                    Person.prototype.setName(name) {
                      this.name = name;
                    }
                   
                    return Person;
                  })();
                   
                  //
                   
                  let person = new Person('Vasya', 23); // {name: 'Vasya', age: 23}
                  person.setName('Petya'); // {name: 'Petya', age: 23}
                  Цитата Serafim @
                  тогда так:

                  ExpandedWrap disabled
                    let Person = (function() {
                      function Person(name, age) {
                        this.name = name;
                        this.age = age;
                      }
                     
                      Person.prototype.setAge(age) {
                        this.age = age;
                      }
                     
                      Person.prototype.setName(name) {
                        this.name = name;
                      }
                     
                      return Person;
                    })();
                     
                    //
                     
                    let person = new Person('Vasya', 23); // {name: 'Vasya', age: 23}
                    person.setName('Petya'); // {name: 'Petya', age: 23}

                  так сложновато :D
                  пока такой стиль не юзаю ;)
                    вот создание объекта основе прототипа (подглядел в одной умной книжке :D)
                    ExpandedWrap disabled
                      var Person = {
                        name: '',
                        age: 0,
                        toString: function() {
                          return this.name + ' is a ' + this.age + ' year old.';
                        },
                        ctor: function(newObj) {
                          var person = Object.create(this);
                          var key;
                          for (key in newObj) {      
                             if (newObj.hasOwnProperty(key) && Object.prototype.hasOwnProperty.call(this, key)) {
                               person[key] = newObj[key];
                             }
                          }
                          return person;
                        },
                      }
                       
                       
                      var gregory = Person.ctor({ name: 'Gregory', age: 42, });
                      console.log(gregory);
                    Сообщение отредактировано: Cfon -
                      :facepalm:
                        :D :D
                          Нельзя тебе в банду, Шарапов...
                            Цитата Cfon @
                            ExpandedWrap disabled
                                for (key in newObj) {


                            ----
                            ExpandedWrap disabled
                              for (let key of Object.keys(newObj)) {
                                 ...
                              }


                            :whistle:
                            Сообщение отредактировано: Serafim -
                              чем отличается? :)
                                p.s.
                                ExpandedWrap disabled
                                  class Person {
                                      call constructor(args = {}) {
                                          for (let key of Object.keys(args)) {
                                              this[key] = args[key];
                                          }
                                      }
                                   
                                      toString() {
                                          return Object.keys(this).map(key => `${key}: ${this[key]}`);
                                      }
                                  }
                                   
                                  let person = Person({name: 'Vasya', age: 42});
                                  console.log(person);


                                Добавлено
                                Цитата Cfon @
                                чем отличается?

                                тем, что ты бегаешь по итератору, например по Symbol.iterator, а через in - по всем полям
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0569 ]   [ 16 queries used ]   [ Generated: 28.03.24, 22:24 GMT ]