在 class 内的函数内创建函数

Creating a function inside a function inside a class

假设我有一些 class,里面有一些功能:

var someClass = class someClass() {
  constructor() {}

  someFunction(someObj)
  {
    function anotherFunction() {
      return JSON.stringify(someObj, null, 2);
    }

    return someObj;
  }
}

在这种情况下,我可以调用 someClass.someFunction(someObj),它会 return [object Object]。在尝试调用 someClass.someFunction(someObj).anotherFunction() 时,它会出现 TypeError: someClass.someFunction(...).anotherFunction is not a function.

我该如何避免这种情况?我尝试创建一个像 someClass.prototype.someFunction.anotherFunction = function() {...} 这样的原型,但这不起作用。

非常感谢, @Medallon.

someClass.someFunction(...).anotherFunction 不是 引用 someFunction 的 "inner" 函数;相反,它指的是 someFunction 编辑的对象上的函数 anotherFunction。因此,您需要 return 一些具有 anotherFunction 的对象作为成员函数才能工作。

示例:

var someClass = class someClass() {
  constructor() {}

  someFunction(someObj)
  {
    function anotherFunction() {
      return JSON.stringify(someObj, null, 2);
    }

    // note the difference here
    return {
      // anotherFunction is a member function of the return object
      anotherFunction: anotherFunction,
    };
  }
}

您正在创建一个函数 (anotherFunction),但从未对其进行任何操作。 JavaScript 引擎可能会完全优化它。

如果您希望它可以在 someFunction 之外访问,您需要做一些事情以使其在 someFunction 之外可以访问。你可能 return 它。或 return 一个具有 属性 的对象。或者将其添加为 属性 到 someObj(尽管这并不常见)。

例如,这里我们 return 一个新对象,上面同时包含函数和原始 someObj(因为您出于某种原因 return 使用它):

var someClass = class someClass {
  constructor() {}

  someFunction(someObj) {
    function anotherFunction() {
      return JSON.stringify(someObj, null, 2);
    }

    return {
      someObj, anotherFunction
    };
  }
};

var sc = new someClass();
var o = sc.someFunction({
  foo: "bar"
});
console.log(o.anotherFunction());


旁注:

  • 您的someClass声明不正确;在 var someClass = class someClass() {.

  • 之后你不应该有 ()
  • 如果变量名称和 class 名称相同,则 var someClass = 部分毫无意义。如果它们不同,至少使用 let 这样变量的提升与 class 的提升相同(例如,它只是半提升)。

  • 压倒性的 JavaScript 中的约定是构造函数以大写字母开头;所以 SomeClass,而不是 someClass。虽然您可以在自己的代码中使用任何您喜欢的约定,但我强烈建议您使用这个约定,它有助于人们阅读您的代码。最起码问问题的时候要照着做。