我的代码已经可以工作了,但是我想问一下是否有任何更改可以使我的函数声明为对象,而不是没有提供任何参数?
这是我下面的 mixin 函数:
import Page from "@/models/Page.js";
/**
* @param {number} pageId id in page table
*/
export default function (pageId) {
return {
data() {
return {
page: Page
}
},
created() {
this.initPageContents();
},
methods: {
async initPageContents() {
if (pageId) {
await Page.addPage(pageId);
}
}
}
}
}
我叫它
mixins: [
pageMixin(24),
],
或
mixins: [
pageMixin(),
],
现在再问我一个问题。是否可以将它称为也像没有参数的函数一样工作的对象?
mixins: [
pageMixin,
],
答案 0 :(得分:0)
不,您不能-该数组中的内容是一个函数引用,这意味着您只能这样做:
mixins[0]()
调用您的函数。如果要将函数的返回值存储在数组中,则需要执行已经做的事情:
mixins: [
pageMixin()
]
答案 1 :(得分:-1)
我不是Java语言专家,但是我把我认为是解决方案的问题凑在一起。它基于this SO question。
我将您的问题简化为:“我有一个函数f
。我想要一个对象o
,以便o
的行为类似于f()
,但是{ {1}}的行为类似于o(a, b, c, ...)
“
例如,我们有一个用于创建“人物”的功能:
f(a, b, c, ...)
,我们希望function makePerson(firstname, age) {
firstname = firstname || "Jackson";
age = age || 17;
return { firstname: firstname, age: age };
}
的行为像makePerson
。我认为拥有makePerson()
和makePerson.firstname == "Jackson"
就足够了。也就是说,我们关心使所有属性正确。
我们可以通过将makePerson.age == 17
的原型设置为具有所需属性的新函数对象来实现:
makePerson
并看到它可行:
// Create a function object
const functionObject = Object.create(Function.prototype);
// Get the default value
const defaultValue = makePerson();
// Copy all the attributes from the default value to the function object
Object.assign(functionObject, defaultValue);
// Make the function object the prototype of our function
Object.setPrototypeOf(makePerson, functionObject);
如果需要,可以将其全部包装在一个函数中:
console.log(makePerson.firstname); // Jackson
console.log(makePerson.age); // 17
// Still works as a function
console.log(makePerson()); // { name: 'Jackson', age: 17 }
console.log(makePerson("Oliver", 50)); // { name: 'Oliver', age: 50 }
然后您可以像这样写function emulateDefault(func) {
/* Return a function `newFunc` such that `newFunc` behaves like
`func()` and `newFunc(...args)` behaves like `func(...args)`. */
// Clone `func`
const funcClone = Object.create(Function.prototype);
Object.assign(funcClone, func);
// Create a function object
const functionObject = Object.create(Function.prototype);
// Get the default value
const defaultValue = func();
// Copy all the attributes from the default value to the function object
Object.assign(functionObject, defaultValue);
// Make the function object the prototype of our function
Object.setPrototypeOf(funcClone, functionObject);
return funcClone;
}
:
pageMixin
我想指出的是,我对这里所发生的一切都不是100%积极,可能还有一些我没有考虑的极端情况。特别是Javascript cloning is particularly difficult,因此const pageMixin = emulateDefault(function() { ... });
可能会因此而出问题,而我不知道emulateDefault
,Object.new
或Object.setPrototypeOf
的详细信息。