关于javascript:从构造函数中创建构造函数

Create a constructor out of a constructor

本问题已经有最佳答案,请猛点这里访问。

可能是一个愚蠢的问题,但......
...是否可以通过 Object.create() 从构造函数中创建构造函数。
就像在伪代码中一样:

1
2
3
function f1(){this.val = 'test';}
var f2 = Object.create(f1);
var f3 = new f2();


不,您不能使用 Object.create - 它创建一个对象,而不是(构造函数)函数。

如果你想"extend" f1,你可以使用 ES6 class 语法:

1
2
3
class f2 extends f1 {}
console.log(new f2) // works
console.log(f1.isPrototypeOf(f2)) // true

您可以使用一个返回类的函数(A 类工厂),而不是调用 Object.create。不过,您不会调用 new 来获得您的初始课程。您将参数发送到工厂(而不是 constructor)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function getClass(message) {
  class Foo {
    constructor() {
      console.log('constructed: ' + message);
    }
    ok() {
      console.log('ok')
    };
  }
  return Foo
}

const bar = new(getClass("yes sir!"))
bar.ok()

新的构造函数只需要调用旧的构造函数,它必须继承所有原型:

1
2
3
4
5
 function f2() {
  f1.call(this);
 }

 f2.prototype = Object.create(f1.prototype);

如果您创建一个扩展 f1 的类 f2,也会发生同样的情况。


您不能使用 Object.create 克隆函数,但可以通过将函数绑定到空对象来实现,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function f1() {
  this.val = 'test';
}

var f2 = f1.bind({});

var f3 = new f2();
var f4 = new f2();

console.log(f3.val);
console.log(f4.val);

f3.val = 'not test';
f4.val = 'other value';

console.log(f3.val);
console.log(f4.val);