Группировка/вложенность get функций

Я расширяю (извините за неправильные имена из других языков, я новичок в JS) Page Объект, добавляя множество функций, например firstLevelFunction1 и firstLevelFunction2. Моя цель — сгруппировать эти функции, чтобы я мог получить к ним доступ с помощью точки, например: firstLevelGroup.secondLevelFunction1. Я создал firstLevelGroup так же, как firstLevelFunction. Функция testLevels предназначена только для проверки поведения на разных уровнях, когда я вызываю ее, результат выглядит следующим образом:

first level function1
first level function2
{ get: [Function: get] }
{ get: [Function: get] }

пока я ожидаю:

first level function1
first level function2
second level function1
second level function2

Мой код:

let Page = require('./../page')
let JsTestingPage = Object.create(Page, {

    firstLevelFunction1: {get: function () { return 'first level function1' }},
    firstLevelFunction2: {get: function () { return 'first level function2' }},

    firstLevelGroup: { get: function () {
        return {
            secondLevelFunction1: {
                get: function () {
                    return 'second level function1'
                }
            },
            secondLevelFunction2: {
                get: function () {
                    return 'second level function2'
                }
            }
        }
    }
    },
    testLevels: {value: function () {
        console.info(this.firstLevelFunction1)
        console.info(this.firstLevelFunction2)
        console.info(this.firstLevelGroup.secondLevelFunction1)
        console.info(this.firstLevelGroup.secondLevelFunction2)
    }}

})
module.exports = JsTestingPage

Пробовал и другие версии, безрезультатно. По крайней мере, приведенный выше не возвращает ошибку.

Посоветуйте, пожалуйста, что делать с групповыми функциями. Также смело заявляйте, что группировать функции вообще нет смысла :)
Кстати, эта структура (первый уровень) более или менее исходит из фреймворка webdriver.io. Группировка функций на втором уровне — моя идея сделать файл более понятным и структурированным.

Спасибо за быстрый и точный ответ. Он работает так, как ожидалось. Тогда я должен решить, действительно ли это более ясно. Если хотите, добавьте его в качестве ответа, чтобы я мог проголосовать и принять его.

kotoj 24.06.2019 14:25

Насчет точек с запятой - я родом с Явы и мне тоже с точкой с запятой понятнее. Но это политика моей компании, и я должен адаптироваться (если не использовать точку с запятой)

kotoj 24.06.2019 14:27

Ух... Это ужасная политика, отсутствие точек с запятой может привести к ошибкам, которые трудно отлаживать.

Teemu 24.06.2019 14:28

Я постараюсь изменить это, когда немного больше изучу JS. Теперь я новичок без какого-либо влияния ¯_(ツ)_/¯ Спасибо за помощь и совет.

kotoj 24.06.2019 14:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это происходит потому, что вы возвращаете инициализатор объекта, где get становится обычным именем метода, он не создает геттер для внутренних объектов. Чтобы исправить это, оберните возвращенный объект в Object.create(null, {...}) (или используйте более значимый прототип, если он есть), и вы получите то, что ожидаете.

let JsTestingPage = Object.create(null, {
  firstLevelFunction1: {
    get: function() {
      return 'first level function1';
    }
  },
  firstLevelFunction2: {
    get: function() {
      return 'first level function2';
    }
  },
  firstLevelGroup: {
    get: function() {
      return Object.create(null, {
        secondLevelFunction1: {
          get: function() {
            return 'second level function1';
          }
        },
        secondLevelFunction2: {
          get: function() {
            return 'second level function2';
          }
        }
      });
    }
  },
  testLevels: {
    value: function() {
      console.info(this.firstLevelFunction1);
      console.info(this.firstLevelFunction2);
      console.info(this.firstLevelGroup.secondLevelFunction1);
      console.info(this.firstLevelGroup.secondLevelFunction2);
    }
  }
});
JsTestingPage.testLevels();

Или, альтернативно, создайте геттеры внутри инициализаторов объектов:

firstLevelGroup: {
    get: function() {
        return {
            get secondLevelFunction1 () {
                return 'second level function1';
            },
            get secondLevelFunction2 () {
                return 'second level function2';
            }
        }   
    }
},

Другие вопросы по теме