获取类(不是对象)的函数引用

时间:2019-12-27 09:45:27

标签: javascript object

我有一个代码,其中一个函数用于修改现有函数并返回新的函数引用。我希望将该函数应用于类的特定方法。 我当前的代码是

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的任何代码段都将有所帮助。

1 个答案:

答案 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.prototypeTemp.prototype.prototypeMethodinstanceMethod,如果/当存在任何实例时,您可以在实例本身上找到它们已创建

¹从技术上讲,它们是使用anotherInstanceMethod来创建的,就像这样:

yetAnotherInstanceMethod

...不是通过简单的分配。我在示例中使用了简单分配,以使其保持...简单。 :-)