在类中的函数内创建函数

时间:2016-09-11 15:58:11

标签: javascript node.js es6-class

假设我有一些内部有一些功能的课程:

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

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

    return someObj;
  }
}

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

我怎么能绕过这个?我尝试创建像someClass.prototype.someFunction.anotherFunction = function() {...}这样的原型,但这不起作用。

非常感谢, @Medallyon。

2 个答案:

答案 0 :(得分:1)

someClass.someFunction(...).anotherFunction 指的是someFunction的“内部”功能;相反,它引用anotherFunction返回的对象上的函数someFunction。因此,您需要返回一些具有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,
    };
  }
}

答案 1 :(得分:1)

您正在创建一个功能(anotherFunction)并且从未对其执行任何操作。 JavaScript引擎可能会完全优化它。

如果您希望在someFunction之外访问它,则需要执行一些操作,以便在someFunction之外访问它。你可以退货。或者返回将其作为属性的对象。或者将其作为属性添加到someObj(尽管这很不寻常)。

例如,在这里,我们返回一个包含函数和原始someObj的新对象(因为您出于某种原因返回了它):



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() {

  • 如果变量名和类名相同,则var someClass =部分无意义。如果他们不同,至少使用let,因此变量的提升与课程的提升相同(例如,它只是半升)。

  • JavaScript中的压倒性的约定是指构造函数以大写字母开头;所以SomeClass,而不是someClass。虽然您可以在自己喜欢的代码中使用任何约定,但我强烈建议您使用此约定,它可以帮助人们阅读您的代码。至少,在提问时请遵循它。