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

问题描述

所以我有一个我无法修改的 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:这是我要解决的原始问题的链接: 如何为node.js插件创建包装类

编辑3:所以我是个白痴,不小心在我的控制台输出中搜索了一些东西,这就是为什么它没有显示我一直收到的错误消息:

this.Vue.setCookie is not a function

尽管我的 IDE 识别出函数的来源,但我猜测setCookie,getCookie等函数仅限于它们都定义的函数范围。

标签: javascriptnode.jsoopmethodsnon-static

解决方案


这是一个版本,如果我正确阅读了这两个问题,应该做你想做的事。请注意,底部包含一个虚拟 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.

向上看也可能是有益的Proxies


推荐阅读