Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.10.2017, 19:32
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

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?
Ответить с цитированием
  #2 (permalink)  
Старый 29.10.2017, 19:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

Luca,
Цитата:
Чтобы избежать конфликта, запрещено одновременно указывать значение value и функции get/set.
дескрипторы-в-примерах
Ответить с цитированием
  #3 (permalink)  
Старый 29.10.2017, 20:08
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

"вон оно чё, Михалыч" )
Цитата:
Чтобы избежать конфликта, запрещено одновременно указывать значение value и функции get/set. Либо значение, либо функции для его чтения-записи, одно из двух.
я пример как раз после прочтения этого параграфа делал и пропустил вот этот момент. ещё раз подтвреждает ценность практики.
Ответить с цитированием
  #4 (permalink)  
Старый 30.10.2017, 00:11
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

А где вы видите в этой статье, что в 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 );

Последний раз редактировалось Белый шум, 30.10.2017 в 00:28.
Ответить с цитированием
  #5 (permalink)  
Старый 30.10.2017, 11:55
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

чтобы не плодить темы доплнительные здесь задам ещё вопрос по теме:
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?
Ответить с цитированием
  #6 (permalink)  
Старый 30.10.2017, 12:18
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

разобрался
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свойства объекта, взятые из свойств этого же объекта. nklf-367 Общие вопросы Javascript 2 17.10.2017 17:36
Объединить свойства объекта Castromen Общие вопросы Javascript 4 29.11.2016 13:30
При вызове локальной функции объекта не могу использовать свойства объекта Gudsaf Общие вопросы Javascript 7 17.09.2016 20:23
IE 8 Не удалось получить значение свойства "match": значением объекта является null abstract Internet Explorer 2 26.08.2011 15:27
Как при чтении или записи свойства объекта вызывать функцию danik.js Общие вопросы Javascript 3 16.09.2010 17:57