Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   get и set свойства объекта (https://javascript.ru/forum/misc/71152-get-i-set-svojjstva-obekta.html)

Luca 29.10.2017 19:32

get и set свойства объекта
 
Здравствуйте.
console.clear();
let obj = { }; // объект как модельный организм ))
let propObj = { // объект для опрделения свойства
    value: "No msg",
    enumerable: true,
    writable: true,
    configurable: true,
    set Msg(msg){
        this.prop = msg;
    },
    get Msg(){
        return this.prop;
    }

};
Object.defineProperty( obj, "prop", propObj );// определяем св-во 
console.log( obj ); // { prop: "No msg" }
console.log( obj.Msg ); // undefined - почему?
obj.Msg = "myMsgText";
console.log( obj.Msg ); // "myMsgText" здесь уже нормально

почему при вызове
console.log( obj.Msg );

первый раз, получаем undefined?

рони 29.10.2017 19:58

Luca,
Цитата:

Чтобы избежать конфликта, запрещено одновременно указывать значение value и функции get/set.
дескрипторы-в-примерах

Luca 29.10.2017 20:08

"вон оно чё, Михалыч" )
Цитата:

Чтобы избежать конфликта, запрещено одновременно указывать значение value и функции get/set. Либо значение, либо функции для его чтения-записи, одно из двух.
я пример как раз после прочтения этого параграфа делал и пропустил вот этот момент. ещё раз подтвреждает ценность практики.

Белый шум 30.10.2017 00:11

А где вы видите в этой статье, что в Object.defineProperty можно указывать именованные get/set ?? У вас эти ф-ии просто не вызываются, а идёт обычное присвоение/получение свойства Msg у объекта - отсюда и результат.
Вам надо так:
let obj = {
    prop: "no msg",
    set Msg(msg){
        this.prop = msg;
    },
    get Msg(){
        return this.prop;
    }
};
console.log( obj );
console.log( obj.Msg );
obj.Msg = "myMsgText";
console.log( obj.Msg );

Luca 30.10.2017 11:55

чтобы не плодить темы доплнительные здесь задам ещё вопрос по теме:
var o = {
     data_prop: "value",
     get accessor_prop() { 
         return accessor_prop;
     },
     set accessor_prop(value) {
         accessor_prop = value + "_set_";
     }
};
console.log(o);
o.accessor_prop = "Yes";
console.log(o.accessor_prop);
console.log(o);

получается, что нам не обязательно создавать само св-во accessor_prop?
почему сей пример работает без волшебного слова this?

Luca 30.10.2017 12:18

разобрался


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