0

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

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() {...},但这不起作用。

非常感谢,@Medallon。

4

2 回答 2

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,
    };
  }
}
于 2016-09-11T16:01:14.213 回答
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声明不正确;你不应该()在 in 之后var someClass = class someClass() {

  • 如果变量名和类名相同,那var someClass =部分是没有意义的。如果它们不同,至少使用let这样变量的提升与类的提升相同(例如,它只是半提升)。

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

于 2016-09-11T16:02:16.027 回答