Se proporciona la siguiente función de constructor y el código de registro...
function Car(brand, year, model, color, utilidad) { this.brand = brand; this.year = year; this.model = model; this.color = color; this.utilidad = utilidad; this.useFor = (prmt) => { this.utilidad.push(prmt); } }; const toyota = new Car("Toyota", 2021, "Prado", "Red", "city"); toyota.useFor('mountain'); console.log(toyota);En lugar de obtener los datos de registro esperados, el código se rompe con el siguiente mensaje...
TypeError: "this.utilidad.push is not a function"¿Por qué pasó esto?
porque * .push () se usa para insertar datos en una matriz, pero coloca la cadena "ciudad" en el parámetro predeterminado;
Del comentario anterior...
"El OP no construyó un prototipo, pero estaba implementando una función que está destinada a ser utilizada como constructor para crear instancias de Car . Además, el OP está inicializando toyota con un argumento de utilidad escrito incorrectamente que se supone que es una matriz y no una cadena para permitir que el método useFor se inserte más tarde en la propiedad de utilidad del objeto".
Por lo tanto, una implementación Car refactorizada internamente podría usar valores iniciales o predeterminados para valores de argumentos omitidos. Podría introducir alguna verificación de tipo formal para no romper con TypeError debido a tipos de argumentos proporcionados incorrectamente. Y además de las tareas de asignar los argumentos como propiedades propias a un objeto, implementa su único método en el prototype de la función constructora...
function Car( brand = 'unknown', year = 'not provided', model = 'unknown', color = 'not provided', utilidad = [], ) { return Object.assign(this, { brand, year, model, color, utilidad: Array.isArray(utilidad) ? utilidad : [utilidad], }); }; Car.prototype.useFor = function useFor (value) { this.utilidad.push(value); }; const dummy = new Car(); const toyota = new Car('Toyota', 2021, 'Prado', 'Red', 'city'); dummy.useFor('test field'); toyota.useFor('mountain'); console.log({ dummy, toyota }); .as-console-wrapper { min-height: 100%!important; top: 0; }La próxima iteración podría introducir la sintaxis de clase y un constructor que espera una sola configuración u argumento de opciones...
class Car { constructor({ brand = 'unknown', year = 'not provided', model = 'unknown', color = 'not provided', utilidad = [], }) { Object.assign(this, { brand, year, model, color, utilidad: Array.isArray(utilidad) ? utilidad : [utilidad], }); } // prototype method(s) useFor(value) { this.utilidad.push(value); } } const dummy = new Car({}); const toyota = new Car({ brand: 'Toyota', year: 2021, model: 'Prado', color: 'Red', utilidad: 'city', }); dummy.useFor('test field'); toyota.useFor('mountain'); console.log({ dummy, toyota }); .as-console-wrapper { min-height: 100%!important; top: 0; }