Oui, c'est possible . Nous pouvons définir getters
pour chaque indice et renvoie la valeur de la propriété dans la méthode du constructeur de la classe. Voir ce code.
class className {
constructor() {
this.name = "Bikram";
this.age = 8;
this.x = 89;
this.y = true;
//Use a for loop and define the getters (with the object property's index as its "name") for each property using Object.defineProperty()
for (let i = 0; i < Object.keys(this).length; i++) {
Object.defineProperty(this, i, {
get: function() {
return Object.values(this)[i]}
});
}
}
}
var b = new className();
console.log(b[0]); // same as b.name ("Bikram")
console.log(b[1]); // = b.age (8)
console.log(b[2]); // = b.x (89)
console.log(b[3]); // = b.y (true)
Edita: Si vous souhaitez modifier les propriétés en fonction de leurs indices, ce qui est bien sûr le cas. Il suffit alors de définir un setter
pour chaque bien dans le Object.defineProperty()
méthode. Elle se présentera comme suit :
// Insert this in place of the old one
Object.defineProperty(this, i, {
get: function() {
return Object.values(this)[i];
},
set: function(newValue) {
this[Object.keys(this)[i]] = newValue;
}
})
console.log(b[0]); // "Bikram"
b[0] = "Bikram Kumar";
console.log(b[0]); // "Bikram Kumar"
Et maintenant vous avez un "objet de type tableau" dont les propriétés peuvent être accédées ou modifiées soit par la clé de la propriété, soit par son index :D
Une remarque en passant : Notez que Object.keys()
et Object.values()
ne renvoie que le propriétés énumérables . Si vous vous contentez de déclarer une propriété sans lui attribuer de valeur, la fonction Object.[key/value]s()
le laisseront dans le tableau retourné, car par défaut ils ne sont pas énumérables. Cela peut prêter à confusion pour les indices ainsi définis (sauf dans le cas où la propriété non déclarée est la dernière).
Pour contourner ce problème, il existe un moyen simple, si vous voulez qu'une propriété ait un index, mais que vous ne voulez pas l'assigner maintenant. Il suffit de lui donner la valeur undefined
et il sera désormais énumérable, et les indices ne seront pas affectés.