我希望通过重新分配 this 的类在js中实现多态。
我简化了一个班级:
class First{
method1 = function(aVar) { this.list.map (e => e === aVar)}
}
和另一个已经从另一个Parent类骚扰的类:
class Second extends Parent{
constructor(){
this.list = ['some elements'];
this.method1 = First.method1.apply(this, arguments)
}
父级不能从第一个扩展; 当我运行 Second 时,它会引发错误: apply 无法应用于 method1 ,因为它没有防御性, 但是当我创建实例时,它会丢失 第二个 作用域:
class Second extends Parent{
constructor(){
this.list = ['some elements'];
this.method1 = (new First).method1.apply(this, arguments)
}
我还需要为First.method1提供参数
我尝试了这个answer,但那没用
答案 0 :(得分:1)
问题是function magic(str) {
let rx = /^([^#\n]*\#)(.*)/;
let string = str.replace(rx, function(m, g1, g2) {
if (g1.endsWith("#")) {
part1 = g1.replace(/\D+/g, "") + "#";
} else {
part1 = g1.replace(/\D+/g, "");
}
return part1 + g2.replace(/\D+/g, "");
});
return string;
}
// Test
tests = { // keys is input string, value is valid result for that input
"#1234a5678b910": "#12345678910",
"12#34a5678b910": "12#345678910",
"1234a56#78b910": "123456#78910",
"1234a5678b91#0": "1234567891#0",
"1234a5678b91#0": "1234567891#0",
"98#765a4321#039c": "98#7654321039",
"98a765#4321#039c": "98765#4321039",
"98a765b4321###39": "987654321#39",
}
Object.keys(tests).map(k=> console.log(`${k} Test: ${(''+(magic(k)==tests[k])).padEnd(5,' ').toUpperCase()} ( result is ${magic(k)} - should be ${tests[k]})`) );
会触发该函数,而您不想触发该函数,而是想创建具有更改的.apply()
上下文的函数。为此,您想使用一个this
方法来创建一个函数,但不触发它。看这段代码:
.bind()
因此class First {
method1() {
this.list.map(e => e)
console.log('I got called');
}
method2() {
return this.list;
}
}
class Parent {}
class Second extends Parent {
constructor(){
super();
this.list = ['second class list'];
this.method1 = (new First()).method1.bind(this)
this.theList = (new First()).method2.apply(this);
}
}
const sec = new Second();
sec.method1();
console.log(sec.theList);
类中的method1
是方法的副本,具有与类Second
相同的名称。它是使用First
创建的,并将bind()
更改为this
类上下文。
然而,Second
类中的theList
字段是调用从Second
类中的method2()
更改为{{ 1}}上下文。它不是函数,而是函数的结果。
看到区别了吗?