javascript - 如何创建可以从多个对象/上下文中调用的非静态方法/类?
问题描述
所以我有一个我无法修改的 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
等函数仅限于它们都定义的函数范围。
解决方案
这是一个版本,如果我正确阅读了这两个问题,应该做你想做的事。请注意,底部包含一个虚拟 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
。
推荐阅读
- python - Fabric2 任务和依赖项
- excel - 我正在尝试使此代码正常工作,但由于 End With 而失败
- json - 使用 JSON 输入过滤器的 AWS Sagemaker 批量转换
- pandas - 将一个 CSV 作为数据框附加到另一个上
- javascript - 商店没有在 redux 中更新?
- azure-data-factory - 如何在我的 ADF 管道中查找哪个活动调用了另一个活动
- c# - 在 Windows 服务中使用 Gmail API
- javascript - 如何获得显示的单元格的精确副本?
- c# - How should property types be used correctly in class design
- cron - Debian 9 的 crontab 权限问题