Expected: When a variable is created using createGreetable
it should have an additional property greet
set by greetable(text)
. The usual string
methods should still be callable on this variable.
What I Tried:
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);
Output:
hello, [object String]!
5
Expected Output:
hello, world!
5
You can extend the string class:
class Greetable extends String {
greet (greeting) {
return `${greeting}, ${this}!`;
}
}
const g = new Greetable('world');
g.greet('hello'); // hello, world!
g.length // 5
A few modifications to your code were needed to get it to work as intended:
this.length
in the greetable
prototype function to update the string length each time (remember this is a string object).const result
line to this.greet
in the constructor function, setting the prototype of this
to the greetablePrototype
as intended, then returning the instance of our object 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);