Estoy aprendiendo sobre los objetos y sus alcances, me confundí y decidí hacer una hoja de personaje de D&D Pathfinder para practicar.
Hice la hoja de personaje como un objeto, objetos secundarios para puntajes de habilidad, fuerza/destreza/inteligencia/etc... y luego valores base y modificadores.
en D&D usas tu valor base para calcular el valor de tu modificador y el modificador se usa a lo largo del juego. El cálculo del modificador es (base - 10) / 2
mientras ejecuto esto, solo obtengo 0 cuando se llama console.log(characterSheet.abilityScore.strength.modifier)
Supongo que mi confusión es sobre mi comprensión del rango de alcance entre la función y el modificador/base. pero no estoy seguro de por dónde empezar.
const characterSheet = {
abilityScore: {
strength: {
base: 2,
modifier: 0,
calcMod: function () {
this.modifier = Math.floor((this.base - 10) / 2);
},
},
dexterity: {
base: 8,
modifier: 0,
calcMod: function () {
this.modifier = Math.floor((this.base - 10) / 2);
},
},
intelligence: {
base: 16,
modifier: 0,
calcMod: function () {
this.modifier = Math.floor((this.base - 10) / 2);
},
},
},
}
También intenté colocar la función en el ámbito global, pero siempre devuelve NaN.
const characterSheet = {
abilityScore: {
strength: {
base: 2,
modifier: function () {
return calcMod(this.base);
},
strength: {
base: 8,
modifier: function () {
return calcMod(this.base);
},
},
strength: {
base: 16,
modifier: function () {
return calcMod(this.base);
},
},
},
}};
function calcMod(val) {
return Math.floor((val - 10) / 2);
}
console.log(calcMod(characterSheet.abilityScore.strength));
puedes usar eso... ?
const characterSheet =
{ abilityScore:
{ strength:
{ base : 2
, modifier : 0
}
, dexterity:
{ base : 8
, modifier : 0
}
, intelligence:
{ base : 16
, modifier : 0
}
, calcMod ( ability )
{
return this[ability].modifier = 0 | ((this[ability].base - 10) / 2);
} } }
console.log( characterSheet.abilityScore.calcMod( 'strength' ) )
console.log( characterSheet.abilityScore.strength.modifier )
O:
const characterSheet =
{ abilityScore:
{ strength : { base : 2, modifier : 0 }
, dexterity : { base : 8, modifier : 0 }
, intelligence : { base : 16, modifier : 0 }
} };
function calcMod( val )
{
return val.modifier = 0 | ((val.base - 10) / 2);
}
console.log( calcMod( characterSheet.abilityScore.strength ))
Deberías usar
function buildScore(base) {
return {
base,
modifier: Math.floor((base - 10) / 2),
};
}
const characterSheet = {
abilityScore: {
strength: buildScore(2),
dexterity: buildScore(8),
intelligence: buildScore(16),
},
};
console.log(characterSheet.abilityScore.strength);
Sin métodos, sin problemas. También podría lograr algo como esto con captadores, pero sería mucho más complicado.
Puede usar un captador para modifier que llame a calcMod() . Esto llama a una función para devolver el valor de la propiedad, de modo que pueda calcularlo en función del valor actual de this.base .
function calcMod(val) {
return Math.floor((val - 10) / 2);
}
const characterSheet = {
abilityScore: {
strength: {
base: 2,
get modifier() {
return calcMod(this.base);
}
},
dexterity: {
base: 8,
get modifier() {
return calcMod(this.base);
}
},
intelligence: {
base: 16,
get modifier() {
return calcMod(this.base);
}
},
},
}
console.log(characterSheet.abilityScore.dexterity.modifier);
characterSheet.abilityScore.dexterity.base = 10;
console.log(characterSheet.abilityScore.dexterity.modifier);