Esperado: cuando se crea una variable mediante createGreetable
, debe tener una propiedad adicional de greet
establecida por greetable(text)
. Los métodos string
habituales aún deberían poder llamarse en esta variable.
Lo que probé:
const greetablePrototype = { greetable: function(greeting) { this.greet = `${greeting}, ${ this.valueOf() }!` } } function createGreetable(str) { const result = new String(str); Object.setPrototypeOf(result, greetablePrototype) return result; } const t = new createGreetable("world"); t.greetable("hello"); console.log(t.greet); console.log(t.length);
Producción:
hello, [object String]! 5
Rendimiento esperado:
hello, world! 5
Puede extender la clase de cadena:
class Greetable extends String { greet (greeting) { return `${greeting}, ${this}!`; } } const g = new Greetable('world'); g.greet('hello'); // hello, world! g.length // 5
Se necesitaron algunas modificaciones a su código para que funcione según lo previsto:
this.length
en la función prototipo greetable
para actualizar la longitud de la cadena cada vez (recuerde que este es un objeto de cadena ).const result
a this.greet
en la función constructora, configurando el prototipo de this
en greetablePrototype
según lo previsto, luego devolviendo la instancia de nuestro objeto return this
. const greetablePrototype = { greetable: function(greeting) { this.greet = `${greeting}, ${this.greet}!` this.length = this.greet.length; } } function createGreetable(str) { this.greet = String(str); Object.setPrototypeOf(this, greetablePrototype) return this; } const t = new createGreetable("world"); t.greetable("hello"); console.log(t.greet); console.log(t.length);