2017-02-07 12 views
1

Я ищу элегантный способ memoize функции класса с использованием Memoizee package.Метод экземпляра Memoizee в узле Класс

Вне класса, вы можете идти об этом тривиальном:

const memoize = require('memoizee') 

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

но внутри блока класса, это не будет работать:

class foo { 
    constructor(){ ... } 

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

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

я могу думать о его создании в конструкторе используя синтаксис this., но это приведет к менее унифицированному определению класса, так как неаудированные методы будут объявлены вне конструктора:

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

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

Как бы вы обернули метод экземпляра?

ответ

1

Можно перезаписать собственное определение метода в конструкторе

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)); 

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

+0

Я думаю, что, похоже на предыдущие предложения, это самый элегантный. Спасибо. – Selfish

2

В зависимости от того, как вы запустите ваш код и будет ли или нет вы используете шаги transpilation, может быть, вы можете использовать memoized-class-decorator с:

class foo { 
    constructor() { ... } 

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

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

Отличный ответ, хотя я искал некоторые непереплетенные творчества. Спасибо. :) – Selfish

1

Существует специальная обработка для методов в memoizee. См: https://github.com/medikoo/memoizee#memoizing-methods

Тем не менее он не будет работать с синтаксисом родного класса, лучшее, что вы можете сделать в этот момент что-то как:

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

Я предполагаю, что это именно так, как-то я пропустил это в документах. – Selfish