Я расширяю (извините за неправильные имена из других языков, я новичок в 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. Группировка функций на втором уровне — моя идея сделать файл более понятным и структурированным.
Насчет точек с запятой - я родом с Явы и мне тоже с точкой с запятой понятнее. Но это политика моей компании, и я должен адаптироваться (если не использовать точку с запятой)
Ух... Это ужасная политика, отсутствие точек с запятой может привести к ошибкам, которые трудно отлаживать.
Я постараюсь изменить это, когда немного больше изучу JS. Теперь я новичок без какого-либо влияния ¯_(ツ)_/¯ Спасибо за помощь и совет.
Это происходит потому, что вы возвращаете инициализатор объекта, где 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';
}
}
}
},
Спасибо за быстрый и точный ответ. Он работает так, как ожидалось. Тогда я должен решить, действительно ли это более ясно. Если хотите, добавьте его в качестве ответа, чтобы я мог проголосовать и принять его.