返回函数或对象Javascript

时间:2019-04-29 00:35:32

标签: javascript vue.js

我的代码已经可以工作了,但是我想问一下是否有任何更改可以使我的函数声明为对象,而不是没有提供任何参数?

这是我下面的 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,
  ],

2 个答案:

答案 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() { ... }); 可能会因此而出问题,而我不知道emulateDefaultObject.newObject.setPrototypeOf的详细信息。