'this' внутри вложенных объектов (JavaScript) - PullRequest
1 голос
/ 20 июня 2019

Я хотел бы иметь такую ​​структуру объекта (как я знаю, это невозможно)

const AUTH = {
    base: 'auth',
    login: {
        enter: `${AUTH.base}/login`,
        password: `${AUTH.base}/login/password`,
    },
}

РЕДАКТИРОВАТЬ: Я также хочу экспортировать объект в виде модуля

Так что ясделал некоторые опыты

Опыт A

const AUTH_BASE = 'auth'
const AUTH_A = {
  login: {
    enter: `${AUTH_BASE}/login`,
    password: `${AUTH_BASE}/login/password`,
  }
}

console.log('enter ->', AUTH_A.login.enter)
console.log('recover ->', AUTH_A.login.password)

Опыт A output:

enter -> auth/login
recover -> auth/login/password

Опыт B

const AUTH_B = {
  base: 'auth',
  login() {
    return `${this.base}/login`
  },
  password() {
    return `${this.base}/login/password`
  },
}

console.log('enter ->', AUTH_B.login())
console.log('recover ->', AUTH_B.password())

Выход опыта B:

enter -> auth/login
recover -> auth/login/password

Опыт C

const AUTH_C = {
  base1: 'auth',
  login: {
    base2: 'auth????????????????',
    enter1: function() {
      return `${this.base1}/login`
    },
    enter2: function() {
      return `${this.base2}/login`
    },
    password: function() {
      return `${this.base}/login/password`
    },
  }
}

console.log('enter 1 ->', AUTH_C.login.enter1())
console.log('enter 2 ->', AUTH_C.login.enter2())
console.log('recover ->', AUTH_C.login.password())

Опыт C вывод:

enter 1 -> undefined/login
enter 2 -> auth????????????????/login
recover -> undefined/login/password

Опыт D

const AUTH_D = {
  base: 'auth',
  login: {},
}

AUTH_D.login = {
  enter: `${AUTH_D.base}/login`,
  password: `${AUTH_D.base}/login/password`,
}

console.log('enter ->', AUTH_D.login.enter)
console.log('recover ->', AUTH_D.login.password)

Вывод опыта D:

enter -> auth/login
recover -> auth/login/password

Мой вопрос: есть ли лучший способ добиться желаемого синтаксиса?

repl.it ссылка: https://repl.it/@SandroMiguel/Endpoints-constants-experience

Ответы [ 3 ]

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

Вы можете использовать статический класс следующим образом:

class Auth {
  static base = 'auth'
  static login = {
    enter: `${Auth.base}/login`
  }
}

Или используйте геттеры для самостоятельной ссылки на объект

const AUTH = {
  base: 'auth',
  get login() {
    return {
      enter: `${AUTH.base}/login`,
      password: `${AUTH.base}/login/password`
    }
  }
}

Таким образом, вы можете получить доступ к своим свойствам, как и любой другой реквизит:

console.log(AUTH.login.enter)
console.log(AUTH.login.password)
0 голосов
/ 20 июня 2019

Лучший метод для достижения того, что вы хотите, это

const AUTH_B = {
    base: 'auth',
    login() {
        return `${this.base}/login`
    },
    password() {
        return `${this.base}/login/password`
    },
}
Object.freeze(AUTH_B);
AUTH_B.base = "something_else";
console.log(AUTH_B.login())

Поскольку свойство объекта теперь заморожено внутри и не может быть отредактировано извне, оно не повлияет на других.
Чтобы экспортировать это как модуль, создайте файл с именем module.js и вставьте его внутрь

const AUTH_B = {
    base: 'auth',
    login() {
        return `${this.base}/login`
    },
    password() {
        return `${this.base}/login/password`
    },
}
Object.freeze(AUTH_B);
AUTH_B.base = "something_else";

exports.AUTH_B = AUTH_B; // export your object like this

Теперь откройте ваш index.js и выполните

var m = require('./module.js'); // access it like m.AUTH_B
console.log(m.AUTH_B.login()); // gives -> auth/login

Пример

0 голосов
/ 20 июня 2019

В комментарии я говорю об этом:

function authFactory(base){
    this.base = base;
    this.login = {
        enter: `${base}/login`,
        password: `${base}/login/password`
    }
}

const AUTH_E = new authFactory("auth");
console.log('enter E ->', AUTH_E.login.enter);
console.log('recover E ->', AUTH_E.login.password);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...