J'aimerais avoir une structure d'objet comme celle-ci (que je sais que ce n'est pas possible)
const AUTH = {
base: 'auth',
login: {
enter: `${AUTH.base}/login`,
password: `${AUTH.base}/login/password`,
},
}
EDIT: je veux aussi exporter l'objet en tant que module
J'ai donc fait quelques expériences
Expérience 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)
Découvrez une sortie:
enter -> auth/login
recover -> auth/login/password
Expérience 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())
Expérience de sortie B:
enter -> auth/login
recover -> auth/login/password
Expérience 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())
Expérience de sortie C:
enter 1 -> undefined/login
enter 2 -> auth????????????????/login
recover -> undefined/login/password
Expérience 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)
Expérience de sortie D:
enter -> auth/login
recover -> auth/login/password
Ma question est: existe-t-il une meilleure façon d'atteindre la syntaxe souhaitée?
Lien repl.it: https://repl.it/@SandroMiguel/Endpoints-constants-experience
3 réponses
Vous pouvez utiliser une classe statique comme celle-ci:
class Auth {
static base = 'auth'
static login = {
enter: `${Auth.base}/login`
}
}
Ou utilisez des getters pour référencer automatiquement l'objet
const AUTH = {
base: 'auth',
get login() {
return {
enter: `${AUTH.base}/login`,
password: `${AUTH.base}/login/password`
}
}
}
Ainsi, vous pouvez accéder à vos propriétés comme tout autre accessoire:
console.log(AUTH.login.enter)
console.log(AUTH.login.password)
La meilleure méthode pour réaliser ce que vous voulez est la suivante
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())
Parce que la propriété d'objet est maintenant figée à l'intérieur et ne peut pas être modifiée de l'extérieur et n'affectera pas les autres.
Pour l'exporter en tant que module, créez un fichier nommé module.js
et collez-le à l'intérieur
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
Maintenant, ouvrez votre index.js et faites
var m = require('./module.js'); // access it like m.AUTH_B
console.log(m.AUTH_B.login()); // gives -> auth/login
Exemple
En commentaire, j'en parle:
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);
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.