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



所以我有一个节点.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(名称、值、选项(行之前,我已经从包装函数内部省略了一些上面的代码,以使我的示例更容易理解,因为它与我的问题无关。很抱歉造成混乱 - 鉴于我给出的示例,我可以看到为什么包装器看起来没有必要。

编辑2:这是我试图解决的原始问题的链接: 如何为 node.js 插件创建包装类

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

this.Vue.setCookie is not a function

尽管我的 IDE 识别函数的来源,但我猜测setCookiegetCookie等函数仅限于它们全部定义的函数的范围。

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

最新更新