Группировка / вложение get-функций - PullRequest
1 голос
/ 24 июня 2019

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

функция первого уровня1
функция первого уровня2
{get: [Function: get]}
{get: [Function: get]}

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

функция первого уровня1
функция первого уровня2
функция второго уровня1
функция второго уровня2

Мой код:

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.log(this.firstLevelFunction1)
        console.log(this.firstLevelFunction2)
        console.log(this.firstLevelGroup.secondLevelFunction1)
        console.log(this.firstLevelGroup.secondLevelFunction2)
    }}

})
module.exports = JsTestingPage

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

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

1 Ответ

1 голос
/ 24 июня 2019

Это происходит из-за того, что вы возвращаете инициализатор объекта, где 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.log(this.firstLevelFunction1);
      console.log(this.firstLevelFunction2);
      console.log(this.firstLevelGroup.secondLevelFunction1);
      console.log(this.firstLevelGroup.secondLevelFunction2);
    }
  }
});
JsTestingPage.testLevels();

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

firstLevelGroup: {
    get: function() {
        return {
            get secondLevelFunction1 () {
                return 'second level function1';
            },
            get secondLevelFunction2 () {
                return 'second level function2';
            }
        }   
    }
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...