2017-02-07 4 views
1

Ich suche eine elegante Möglichkeit, eine Klassenfunktion mit Memoizee package Memo zu machen.Memoizee Instanz Methode in Knoten Klasse

Außerhalb einer Klasse, können Sie diesen trivialer gehen:

const memoize = require('memoizee') 

const myFunc = memoize(function myfunc(){ ... }) 

aber innerhalb einer Klasse-Block, das wird nicht funktionieren:

class foo { 
    constructor(){ ... } 

    // Without memoization you would do: 
    myFunc(){ ... } 

    // Can't do this here: 
    myFunc = memoize(function myfunc(){ ... }) 
} 

Ich denke, es kann im Konstruktor der Schaffung Verwenden Sie this. Syntax, aber dies wird zu einer weniger einheitlichen Klassendefinition führen, da nicht Memo-Methoden außerhalb des Konstruktors deklariert werden:

class foo { 
    constructor(){ 
     // Inside for memoized: 
     this.myFunc = memoize(function myfunc(){ ... }) 
    } 

    // Outside for non-memoized: 
    otherFunc(){ ... } 
} 

Wie würden Sie eine Instanzmethode umbrechen?

Antwort

1

Es ist möglich, eigene Methodendefinition im Konstruktor

class Foo { 
    constructor() { 
    this.bar = _.memoize(this.bar); 
    } 

    bar(key) { 
    return `${key} = ${Math.random()}`; 
    } 
} 

const foo = new Foo(); 
console.log(foo.bar(1)); 
console.log(foo.bar(1)); 
console.log(foo.bar(2)); 
console.log(foo.bar(2)); 
zu überschreiben

1 = 0.6701435727286942 1 = 0.6701435727286942 2 = 0.38438568145894747 2 = 0.38438568145894747

+0

Ich denke, während es den vorherigen Vorschlägen ähnlich ist, ist es das eleganteste. Vielen Dank. – Selfish

2

Abhängig davon, wie Sie Ihren Code ausführen und ob Sie transpilation Schritte verwenden, vielleicht können Sie die memoized-class-decorator mit verwenden:

class foo { 
    constructor() { ... } 

    // Without memoization: 
    myFunc() { ... } 

    // With memoization: 
    @memoize 
    myFunc() { ... } 
} 
+0

Große Antwort, obwohl ich nach etwas nicht-transpiled Kreativität suchte. Vielen Dank. :) – Selfish

1

Es gibt eine spezielle Handhabung für Methoden in memoizee ist. Siehe: https://github.com/medikoo/memoizee#memoizing-methods

Noch wird es nicht mit nativer Klasse Syntax arbeitet, am besten Sie an dieser Stelle tun können, ist etwas wie:

const memoizeMethods = require('memoizee/methods'); 

class Foo { 
    // .. non memoized definitions 
} 
Object.defineProperties(Foo.prototype, memoizeMethods({ 
    // Memoized definitions, need to be provided via descriptors. 
    // To make it less verbose you can use packages as 'd': 
    // https://www.npmjs.com/package/d 
    myFunc: { 
    configurable: true, 
    writable: true, 
    enumerable: false, 
    value: function() { ... } 
} 
}); 
+0

Ich denke, das ist genau das, irgendwie habe ich es in der Dokumentation verpasst. – Selfish

Verwandte Themen