如何在 es6 class 中动态生成 class 方法名称?
How to dynamically generate class method names in an es6 class?
我正在尝试弄清楚是否可以在 es6 class 上生成方法名称。以下面的例子为例,Replacer
,它从规则集中运行替换规则:
let smileyRules = [
{ ascii: ':)', unicode: ' ' },
{ ascii: '8)', unicode: ' ' }
]
class Replacer {
constructor(rules){
this.rules = rules
}
replace(text, from, to){
this.rules.forEach(rule => text = text.replace(rule[from], rule[to]))
return text
}
}
let smileyizer = new Replacer(smileyRules)
smileyizer.replace(':)', 'ascii', 'unicode')
// " "
smileyizer.replace(':)', 'unicode', 'ascii')
// ":)"
这就是它应该做的,但我也想生成像这样工作的便捷方法:
smileyizer.ascii2unicode(':)')
这将在内部调用
smileyizer.replace(':)', 'ascii', 'unicode')
当然,我也想启用unicode2ascii
。 (事实上,这整个事情的重点是它将与规则集一起使用,其中每个规则可能有十几个键,所以这是很多方便的方法。)
在我的 Replacer
class 中,我希望生成类似于以下内容的方法:
generate(){
this.rules.map(firstRule =>
this.rules.map(secondRule => {
// somehow create method called firstRule + '2' + secondRule
})
}
}
…然后我会从构造函数中调用它。
我知道可以使用方括号表示法创建计算属性,但我不知道如何从 另一个 方法中做一些等效的事情。
解决方案(感谢@DShook)
这是一个有效的 generate
方法:
generate(){
let names = Object.keys(this.rules[0])
names.forEach(firstName =>
names.forEach(secondName => {
let method = firstName + '2' + secondName
this[method] = (text, from, to) => this.replace(text, firstName, secondName)
})
)
}
在您的构造函数中,您只需要动态创建函数,但是您需要这样:
this['firstRule' + '2' + 'secondRule'] = function(text, from, to){
return text;
}
generate(){
this.rules.map(firstRule =>
this.rules.map(secondRule => {
this[firstRule+"2"+secondRule] = char => this.replace(char, firstRule, secondRule);
});
);
}
但是,动态方法是一个非常糟糕的主意...
我正在尝试弄清楚是否可以在 es6 class 上生成方法名称。以下面的例子为例,Replacer
,它从规则集中运行替换规则:
let smileyRules = [
{ ascii: ':)', unicode: ' ' },
{ ascii: '8)', unicode: ' ' }
]
class Replacer {
constructor(rules){
this.rules = rules
}
replace(text, from, to){
this.rules.forEach(rule => text = text.replace(rule[from], rule[to]))
return text
}
}
let smileyizer = new Replacer(smileyRules)
smileyizer.replace(':)', 'ascii', 'unicode')
// " "
smileyizer.replace(':)', 'unicode', 'ascii')
// ":)"
这就是它应该做的,但我也想生成像这样工作的便捷方法:
smileyizer.ascii2unicode(':)')
这将在内部调用
smileyizer.replace(':)', 'ascii', 'unicode')
当然,我也想启用unicode2ascii
。 (事实上,这整个事情的重点是它将与规则集一起使用,其中每个规则可能有十几个键,所以这是很多方便的方法。)
在我的 Replacer
class 中,我希望生成类似于以下内容的方法:
generate(){
this.rules.map(firstRule =>
this.rules.map(secondRule => {
// somehow create method called firstRule + '2' + secondRule
})
}
}
…然后我会从构造函数中调用它。
我知道可以使用方括号表示法创建计算属性,但我不知道如何从 另一个 方法中做一些等效的事情。
解决方案(感谢@DShook)
这是一个有效的 generate
方法:
generate(){
let names = Object.keys(this.rules[0])
names.forEach(firstName =>
names.forEach(secondName => {
let method = firstName + '2' + secondName
this[method] = (text, from, to) => this.replace(text, firstName, secondName)
})
)
}
在您的构造函数中,您只需要动态创建函数,但是您需要这样:
this['firstRule' + '2' + 'secondRule'] = function(text, from, to){
return text;
}
generate(){
this.rules.map(firstRule =>
this.rules.map(secondRule => {
this[firstRule+"2"+secondRule] = char => this.replace(char, firstRule, secondRule);
});
);
}
但是,动态方法是一个非常糟糕的主意...