我有一个代码,其中一个函数用于修改现有函数并返回新的函数引用。我希望将该函数应用于类的特定方法。 我当前的代码是
function modifyMethod(func) {
return function() {
console.log('working');
return func.apply(this, arguments);
};
}
function modifyClassMethods(ClassName, methodArray) {
// The code goes here
return ClassName;
}
class Temp {
hi() {
console.log("hi method");
}
}
Temp = modifyClassMethods(Temp, ["hi"]);
const temp = new Temp();
// This should print
//
// working
// hi method
temp.hi();
当我尝试使用modifyMethod
调用方法Temp.hi
时,func
未定义。如果我创建一个对象然后修改该方法,则新方法将仅应用于该特定对象的方法,而不应用于该特定类的所有对象。
请注意,这仅是示例。我想将此修改应用于多个类的方法。因此,我也不能一概而论。 modifyClassMethods
的任何代码段都将有所帮助。
答案 0 :(得分:5)
在class
构造体中用方法语法定义的未标记为static
的方法是原型方法,因此它们位于{{1} },而不是Temp.prototype
本身。这样便可以在其中进行更新:
Temp
只有 static 方法以Temp.prototype.hi = modifyMethod(Temp.prototype.hi);
本身结尾。
您可能会看到Temp
主体中使用class fields proposal的语法创建的其他函数:
class
这些是实例方法。它们是由构造函数创建的,并为每个实例重新创建,大致就像它们是这样写的:¹
class Temp {
hi = () => {
//
};
}
直到/除非创建了实例,否则它们不能包装,因为它们是实例特定的。
最后,请考虑:
class Temp {
constructor() {
this.hi = () => {
//
};
}
}
该类显示三种方法:
class Temp {
static staticMethod() {
// ...
}
prototypeMethod() {
// ...
}
instanceMethod = () => {
// ...
};
constructor() {
this.anotherInstanceMethod = () => {
// ...
};
this.yetAnotherInstanceMethod = function {
// ...
};
}
}
(例如staticMethod
),Temp
(您可以在Temp.staticMethod
上找到(例如prototypeMethod
);和Temp.prototype
,Temp.prototype.prototypeMethod
和instanceMethod
,如果/当存在任何实例时,您可以在实例本身上找到它们已创建¹从技术上讲,它们是使用anotherInstanceMethod
来创建的,就像这样:
yetAnotherInstanceMethod
...不是通过简单的分配。我在示例中使用了简单分配,以使其保持...简单。 :-)