预期:当使用createGreetable
创建变量时,它应该有一个由greetable(text)
设置的附加属性greet
。通常的string
方法仍然可以在这个变量上调用。
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);
输出:
hello, [object String]!
5
预期输出:
hello, world!
5
您可以扩展字符串class:
class Greetable extends String {
greet (greeting) {
return `${greeting}, ${this}!`;
}
}
const g = new Greetable('world');
g.greet('hello'); // hello, world!
g.length // 5
需要对代码进行一些修改才能使其按预期工作:
- 在
greetable
原型函数中增加this.length
以每次更新字符串长度(记住这是一个字符串对象) - 在构造函数中将
const result
行更改为this.greet
,将this
的原型设置为greetablePrototype
,然后返回对象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);
const greetableProto = {
greet: function greet(greeting) {
return `${greeting}, ${this}!`;
}
}
Object.setPrototypeOf(greetableProto, String.prototype);
function createGreetable(str) {
const result = new String(str);
Object.setPrototypeOf(result, greetableProto);
return result
}
const g2 = createGreetable('Mark')
console.log(g2.greet('Hello'))