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() {...}ません。

よろしくお願いします、@Medallyon。

4

2 に答える 2

1

someClass.someFunction(...).anotherFunction の「内部」関数を参照していませsomeFunction。代わりに、anotherFunctionによって返されるオブジェクトの関数を参照しますsomeFunctionanotherFunctionしたがって、これを機能させるには、メンバー関数として持つオブジェクトを返す必要があります。

例:

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宣言は正しくありません。()after inを付けるべきではありませんvar someClass = class someClass() {

  • そのvar someClass =部分は、変数名とクラス名が同じだと意味がありません。それらが異なる場合は、少なくともlet変数の巻き上げがクラスの場合と同じになるように使用します (たとえば、半分だけ巻き上げられます)。

  • JavaScriptの圧倒的な慣例は、コンストラクター関数を大文字で始めることです。そうSomeClassではありませんsomeClass。独自のコードでは任意の規則を使用できますが、これを使用することを強くお勧めします。コードを読む人に役立ちます。少なくとも、質問するときはそれに従ってください。

于 2016-09-11T16:02:16.027 に答える