Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有更好的方法从构造函数返回对象和构造函数?_Javascript_Object_Constructor_Return_Return Value - Fatal编程技术网

Javascript 有没有更好的方法从构造函数返回对象和构造函数?

Javascript 有没有更好的方法从构造函数返回对象和构造函数?,javascript,object,constructor,return,return-value,Javascript,Object,Constructor,Return,Return Value,我试图返回一个对象和构造函数。我有一些工作,但它有点丑陋,希望有一个更好的方式 function Something(val) { if (!(this instanceof Something)) return new Something(val) let Constructor = function() { return function(val) { return new Something(val) } } let obj = ne

我试图返回一个对象和构造函数。我有一些工作,但它有点丑陋,希望有一个更好的方式

function Something(val) {
  if (!(this instanceof Something))
    return new Something(val)

  let Constructor = function() {
    return function(val) {
      return new Something(val)
    }
  }

  let obj = new Constructor()
  obj.test = val
  return obj
}

let a = Something('a')
let b = new Something('b')
let c = b('c')

console.log(a) // { [Function] test: 'a' }
console.log(b) // { [Function] test: 'b' }
console.log(c) // { [Function] test: 'c' }
谢谢你的帮助

编辑:

经过进一步考虑,我认为需要更多的解释,并决定从不同的角度来处理这个问题

好的,让我看看我是否能假设清楚地表达我的问题。我有一个工厂,虽然使用ES5函数原型,但它应该解析为另一个类。另一个类应该能够有一个可选的类构造函数函数以及我们所称的类方法。这个自定义类还需要是一个实例,以便它可以在引用该类的方法中存储数据

理想情况下,我们需要以下语法

const something = Something('customClass') // new keyword is optional
something.someMethod()
// or
something(optionalConfig).someMethod()
除了使用可选构造函数调用类之外,我们还必须实例化一个新实例

使这些线作用于不同的实例:

something.someMethod() // refers to the instance already created
something(optionalConfig).someMethod() // new instance
something(otherOptionalConfig).someMethod() // new instance

你似乎在寻找类似于

function Custom(config) {
  function customInstance(moreConfig) {
    return new Custom(config + moreConfig); // not calling Something!
  }
  Object.setPrototypeOf(customInstance, Custom.prototype);
  customInstance.config = config;
  customInstance.test = true
  return customInstance;
}
Custom.prototype = Object.create(Function.prototype);
Custom.prototype.method = function() { … };

const constructors = {Custom, …};
function Something(className) {
  if (!constructors.hasOwnProperty(className)) throw new Error("…");
  return new constructors[className];
}

假设自定义构造函数和某物工厂仍然返回函数对象,无论如何,新操作符是可选的,您不需要明确检查它。

您不喜欢的明显工作代码到底是什么?主要是因为分配另一个对象需要我循环对象并调用object.defineProperty,以便将函数与对象合并在一起。您发布的代码“但是,我不会做那样的事情。@LeviRoberts如果我不理解这个问题,我就无法帮助解决。”。你在问题中发布的代码确实很难看,而且我做了一些奇怪的事情,但是如果不知道什么是有效的,我就不能提出替代方案。我不是在挑战你的动机,我想让你说出来。啊,谢谢。我唯一不明白的是CustomClass1和CustomClass2之间的区别是什么——它们会有不同的方法表现不同吗?它们来自哪里,或者它们真的是同一类的所有实例,只是初始配置不同吗?感谢您花时间回答。需要注意的是,这似乎需要自定义类创建自己的实例,并设置原型链,而不是工厂。这不适用于我们的用例。除此之外,我相信Object.setPrototypeOf不是ES5,尽管有一个polyfill。最后,这里要做的似乎比简单地创建一个新的工厂实例并在工厂内返回类构造函数new来创建一个新的类实例要多得多,在我的例子中,这还有一个问题,那就是您必须在使用构造函数对象创建自定义类之前就知道。除非您还展示了一个可以使用ES5语法动态添加这些内容的示例。@LeviRoberts在您的问题中没有要求使用ES5,因此通常假设您可以使用当代功能:-@LeviRoberts您不清楚这些类来自何处,所以我假设您也可以编写它们的代码。在您问题中的示例中,唯一的示例类甚至是在某个对象中定义的。当然,如果您有多个类,那么所有允许调用实例的内容都可以抽象出来。请编辑您的问题,给出一个如何定义它们的示例。@LeviRoberts构造函数对象是一个简单的按名称查找类的表,它是可变的-您可以随时添加类。在您提到的注释中,它们来自它们自己的“customClass”文件,我正在从工厂导入异步文件。-在这里就这么做吧,我不知道动态导入它们到底要做什么,所以我在答案中选择了一个简化的解决方案。