首页 > 解决方案 > 实验:JavaScript 实例本身可以是构造函数并拥有自己的一组实例吗?

问题描述

let bar;
function foo(){
  this.x=x;
  this.y=y;
}
bar=new foo(1,2);
/*Since all functions in javascript are objects. 
Why can't an instance an object be a constructor itself?*/
!function bar(a,b){
  this.a=a;
  this.b=b;
}(); // (1)
let bar1=new bar(3,4);
console.log(bar1.a);

(1):使用命名的IIFE,bar可以同时是实例和构造函数吗?

这只是一个有趣的技巧,可以利用语言的自由来看看它是否有可能,还有其他方法吗?

标签: javascriptinheritanceconstructorprototype

解决方案


JavaScript 实例本身可以是构造函数并拥有自己的一组实例吗?

当然,一个函数是一个实例,Function一个构造函数是一个函数

所以你可以有

const instance1 = new Function("a", "this.a = a;");
const instance2 = new instance1("foo");
console.log(instance2.a); // "foo"

如果您需要instance1的不仅仅是一个原始函数,您甚至可以扩展这个构造函数:

class MyFunc extends Function {
  doSomethingMore(){ console.log("I'm doing more"); }
}
const instance1 = new MyFunc("a", "this.a = a;");
instance1.doSomethingMore();
const instance2 = new instance1("foo");
console.log(instance2.a); // "foo"

但我看不出你想要这样做的明确原因......

(请注意,通过Function构造函数动态创建函数通常不如通过函数表达式或语句在解析时“执行”。)


推荐阅读