用构造函数创建一个构造函数

时间:2018-10-06 17:58:21

标签: javascript constructor prototype

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

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

4 个答案:

答案 0 :(得分:1)

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

如果要“扩展” f1,可以为此使用ES6 class语法:

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

答案 1 :(得分:0)

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

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);

答案 2 :(得分:0)

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

 function f2() {
  f1.call(this); 
 }

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

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

答案 3 :(得分:0)

您可以有一个返回类的函数(类工厂),而不是调用Object.create。不过,您不会打电话给new来上初学。您可以将参数发送到工厂(而不是constructor

function getClass(message) {
  class Foo {
    constructor() {
      console.log('constructed: ' + message);
    }
    ok() {
      console.log('ok')
    };
  }
  return Foo
}

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