Как создать нестати c методы / класс, которые я могу вызывать из нескольких объектов / контекстов? - PullRequest
0 голосов
/ 11 февраля 2020

Итак, у меня есть модуль node.js, который я не могу изменить, который имеет нестатические c методы, такие как .set, .get, .remove и др. c. Я хочу создать нестационарные c методы-обертки для них, но хочу сделать это так, чтобы я мог оставить объект / контекст, который они вызывают, неоднозначным.

Например, в настоящее время я использую эти методы, такие как:

this.set(name, value, options);

и хочу воссоздать функцию-оболочку, где this может измениться выше.

Я думал, что это должно выглядеть примерно так:

export default function($) {

  return {
    set: function (name, value, options) {
      $.set(name, value, options);
    },

    get: function (name) {
      return $.get(name);
    },

    remove: function (name) {
      $.remove(name);
    }
  };
};

Где передается $ - это объект / контекст, из которого вызывается метод (например, но обязательно this), но это не похоже на работу. Любые идеи? Возможно ли это вообще?

РЕДАКТИРОВАТЬ: Как я уже сказал в комментарии ниже, я пытаюсь использовать некоторые параметры по умолчанию, поэтому мне не нужно постоянно указывать определенные параметры каждый раз, когда я вызываю метод, и использую Функция-обертка для этого. Я опустил некоторый код выше внутри функции-оболочки перед вызовом строки $ .set (name, value, options), чтобы сделать мой пример более понятным, поскольку он не имеет отношения к моему вопросу. Извините за путаницу - я могу понять, почему оболочка выглядит ненужной, учитывая приведенный мной пример.

РЕДАКТИРОВАТЬ 2: Вот ссылка на исходную проблему, которую я пытаюсь решить: Как создать класс-оболочка для node.js плагин

РЕДАКТИРОВАТЬ 3: Итак, я идиот и случайно искал что-то на моей консоли, поэтому на нем не отображалось сообщение об ошибке, которое я получал все вместе:

this.Vue.setCookie is not a function

Несмотря на то, что моя IDE распознала, откуда исходит функция, я предполагаю setCookie, getCookie, et c. функции ограничены областью действия функции, в которой они все определены.

1 Ответ

0 голосов
/ 11 февраля 2020

Вот версия, которая, если я правильно прочитал два вопроса, должна делать то, что вы хотите. Обратите внимание, что в нижней части включена фиктивная реализация ie.

Проблема в том, что она очень похожа на код, который вы предоставили; Я не знаю, почему это не сработает.

// Creates a wrapper for a cookies object such as our `foo.bar.cookies`
const wrapCookies = (cookies, defaults) => ({
  set: (name, value, options) => 
    cookies.set(name, value, Object.assign({}, defaults, options || {})),
  get: (name) => cookies.get(name),
  remove: (name) => cookies.remove(name)
})

console.log('Test the original cookie implementation')
console.log('----------------------------------------')
foo.bar.cookies.set('c1', 'v1', {a: 1})
console.log('c1', foo.bar.cookies.get('c1'))
foo.bar.cookies.set('c2', 'v2', {a: 2})
foo.bar.cookies.remove('c1')


// Create wraper with given defaults
const myCookies = wrapCookies(foo.bar.cookies, {b: 10, c: 42})


console.log(' ')
console.log('Test the wrapper')
console.log('----------------------------------------')
myCookies.set('c3', 'v3', {a: 5})          // defaults `b` and `c`
console.log('c2', myCookies.get('c2'))     // keeps original references
console.log('c3', myCookies.get('c3'))     // handles new references
myCookies.set('c4', 'v4', {a: 7, b: 101})  // overrides `b`
<script>
// Dummy implementation for demonstration.
// Saves and logs on `set`, `remove`, just returns on `get`
const foo = {
  bar: {
    cookies: ((storage) => ({
      set: (name, value, options) => {
        console.log(`setting: "${name}" to "${value}" using ${JSON.stringify(options)})}`)
        storage[name] = {value, options}
      },
      get: (name) => storage[name],
      remove: (name) => {
        console.log(`removing: "${name}"`)
        delete storage[name]       
      }
    }))({})
  }
}

</script>

Если основным вопросом было только то, как объединить значения по умолчанию с вашим новым объектом, то вы, вероятно, захотите прочитать о Object.assign.

Также может быть полезно поискать Proxies.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...