如何创建可以从多个对象/上下文中调用的非静态方法/类?

问题描述 投票:-2回答:1

因此,我有一个我无法修改的node.js模块,该模块具有非静态方法,例如.set.get.remove等。我想为其创建非静态包装器方法,但想要以一种我可以离开对象/上下文的方式来消除它们的模棱两可。

例如,我目前使用这些方法,例如:

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:这是我要解决的原始问题的链接:How to create a wrapper class for node.js plugin

javascript node.js oop methods non-static
1个回答
0
投票

这里是一个版本,如果我正确阅读了两个问题,应该可以执行您想要的操作。请注意,底部包含一个虚拟cookie实现。

麻烦的是,它看起来非常像您提供的代码;我不知道为什么这行不通。

// 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

查找Object.assign也可能很有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.