假设我有一些带有某些功能的类:

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。

最佳答案

您正在创建一个函数(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。尽管您可以在自己喜欢的代码中使用任何约定,但我强烈建议您使用此约定,它可以帮助人们阅读您的代码。至少在提问时要遵循它。

07-24 09:47
查看更多