Dies mag eine dumme Frage sein, aber ist es möglich, dies bei einem Methodenaufruf einer Klasse neu zu erstellen? Z.B:

const foo = new Foo();
console.log(foo.a(1).b(2));
// for example, outputs 3 (1+2)
// the a method will create a new namespace and attach 1 to it, and b will use that new namespace
console.log(foo.b(2));
// this will result in an error, as there is no new namespace from the a method anymore, so b cannot add to anything?

Vielleicht ist das zu schwer zu verstehen, sorry.

class Foo {
  a(number) {
    this.a = number;
    return this;
  }
  b(number) {
    return this.a + number;
  }
}

Dies wäre der Code, in dem dieselbe Variable verwendet wird - dies passt nicht zu dem, was ich wollte, aber es ist das, was ich derzeit habe.

// pseudo
class Foo {
  a(number) {
    const uniqueVariable = number
    return uniqueVariable
    // it'll somehow pass the number from this method to the next method
  }
  // where it can be used with the second method's input
  b(uniqueVariable, number) {
    return uniqueVariable + number
  }
}
foo.a(1).b(2) = 3

Dieses Beispiel würde offensichtlich einen Fehler verursachen, da der Rückgabewert von a () eine Zahl ist und keine Methode, für die eine Methode erneut verwendet werden kann. Bitte lassen Sie mich wissen, wenn ich weiter erklären muss - ich habe einige Schwierigkeiten, es richtig zu erklären.

0
Steam gamer 8 Feb. 2020 im 16:00

3 Antworten

Beste Antwort

Wenn die Absicht ist, dass foo.a(1).b(2) foo ändert, oder wenn es Ihnen nichts ausmacht, foo zu ändern, funktionieren die anderen Antworten hier.

Wenn Sie jedoch nur möchten, dass foo.a(1).b(2) 3 zurückgibt, ohne foo zu ändern, müssen Sie ein neues {{X3} zurückgeben. }.

Wenn Sie wirklich darauf aus sind, console.log() 3 anstatt Foo { value: 3 } drucken zu lassen, können Sie auch inspect() anpassen (vorausgesetzt, die Frage ist mit {{X4 gekennzeichnet) }}).

Alle zusammen:

const util = require('util');

class Foo {
    constructor(value) {
        this.value = value || 0;
    }

    add(value) {
        return new Foo(this.value + value);
    }

    a(value) {
        return this.add(value);
    }

    b(value) {
        return this.add(value);
    }

    [util.inspect.custom]() {
        return this.value;
    }
}

const foo = new Foo();
console.log(foo);
console.log(foo.a(2).b(1));
console.log(foo);

Ausgabe:

0
3
0
0
root 9 Feb. 2020 im 20:36

Bei meiner Lösung habe ich beschlossen, zwei Variablen zu erstellen, die die Werte jeder Methode enthalten. (https://jsbin.com/wozuyefebu/edit?js,console)

Die Methode a() gibt eine Zahl zurück, wenn der Parameter isSingle auf true gesetzt ist. Wenn nicht, wird das Objekt this zurückgegeben, sodass Sie die Methode b() verketten können. Dies könnte ein Hack sein, aber ich glaube, es löst Ihr Problem.

Ich schreibe über Javascript und Webentwicklung in meinem Blog :) https://changani.me/blog

class Foo {
  constructor() {
    this.aValue = 0;
    this.bValue = 0;
  }

  /**
  * @param {Number} value
  * @param {Boolean} isSingle
  * @returns {Object/Number}
  */
  a(value = 0, isSingle = false) {
    this.aValue = value;
    return isSingle ? this.aValue : this;
  }

  /**
  * @param {Number} value
  * @returns {Number}
  */
  b(value = 0) {
    this.bValue = this.aValue + value;
    return this.bValue;
  }
}

const x = new Foo();

console.log("Should return 3: ", x.a(2).b(1));
console.log("Should return an 2: ", x.a(2, true));
console.log("Should return an instance of the object: ", x.a(2));
console.log("Should return 1: ", x.b(1));
console.log("Should return 0: ", x.a().b());

(https://jsbin.com/wozuyefebu/edit?js,console)

0
Firmino Changani 8 Feb. 2020 im 13:42

Wenn Sie Methoden für den Rückgabewert von Methoden aufrufen möchten, sollten Sie this von diesen Methoden zurückgeben. Sie benötigen jedoch eine zusätzliche Methode, z. B. value(), um das Ergebnis der Summe zu erhalten.

Ein möglicher Weg ist unten gezeigt.

class Foo {
  _a = 0;
  _b = 0;
  
  a(number) {
    this._a = number;
    return this;
  }
  
  b(number) {
    this._b = number;
    return this;
  }
  
  value() {
    return this._a + this._b;
  }
}

const foo = new Foo();
console.log(foo.a(1).b(2).value());
console.log(foo.b(5).value());
0
Wand Maker 8 Feb. 2020 im 18:55