Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ошибка в геттере (https://javascript.ru/forum/misc/70509-oshibka-v-gettere.html)

DGGDAK47 11.09.2017 16:11

Ошибка в геттере
 
Вложений: 1
В чем тут ошибка??? Может у меня что-то не так с браузером и я предоставлю еще и скрин.

<script>
       var ob={
           i:null,
           set i(p){ i=p;},
           get i(){ return i;},
       }
       
       ob.i;
    </script>

Dilettante_Pro 11.09.2017 17:09

<script>
       var ob={
           i:null,
           get iGet(){ return this.i;},
           set iSet(p){ this.i=p;}
       }     
       alert(ob.i);
       ob.i = "Test";
       alert(ob.i);
</script>

рони 11.09.2017 17:15

DGGDAK47,
может так ?
<script>
  "use strict";
       var ob={
           y:null,
           set i(p){ this.y=p;},
           get i(){ return this.y;}
       }
       alert(ob.i)

  </script>

рони 11.09.2017 17:19

Dilettante_Pro,
alert(ob.iGet); ???

рони 11.09.2017 19:45

DGGDAK47,
<script>
  "use strict";
       var ob={
           set i(p){ this.y=p;},
           get i(){ return this.y;}
       }
       Object.defineProperty(ob, "y", {value: null,enumerable: false, writable: true});
       alert(ob.i)
       alert(Object.keys(ob))
  </script>

DGGDAK47 11.09.2017 19:52

Сам спросил - сам ответил
 
Позже я разобрался как ето работает (геттеры и сеттеры) и сейчас я это опишу.может пригодится кому...

Создавая аксессоры get и set-подразумевается,что при вызове set,он создаст нужное свойство,равное имени связанных аксессоров и нужного свойства,с которым они будут работать,между собой.Они перекроют ранее созданное свойство,с таким же именем и поэтому не нужно создавать свойство для них.

Моя ошибка была в том,что я создал отдельно свойство и думал,что создав аксессоры,они свяжутся с ним по имени,но они его перекрывали.Это и объясняет,что в get я вызывал return на несуществующее свойство,до вызова set.

Надеюсь кому-то этот материал поможет,лол.
Помимо этого,еще следует ознакомиться с атрибутами свойств.

Dilettante_Pro 12.09.2017 11:43

рони,
Цитата:

Сообщение от рони
Dilettante_Pro,
alert(ob.iGet); ???

<script>
       var ob={
           i:null,
           get iGet(){ return this.i;},
           set iSet(p){ this.i=p;}
       }     
       alert(ob.iGet);
       ob.i = "Test";
       alert(ob.iGet);
</script>

рони 12.09.2017 12:44

Dilettante_Pro,
вы создали новое свойство , мой вариант тот же(но дополнительное свойство "спрятано" enumerable: false,).
хотя как сказано выше достаточно было так
var ob={
           set i(p){ i=p;},
           get i(){ return i;}
       }
       ob.i=null;//сначала установить значение
       alert(ob.i);

Dilettante_Pro 12.09.2017 14:00

рони,
Ну а у меня все свойства доступны - чем больше, тем лучше ! :dance:


Часовой пояс GMT +3, время: 14:11.