javascript中如何让类工厂和构造函数变成同一个函数

我们知道在js中可以用一个函数来定义对象的类,该函数称之为对象的构造函数,我们在需要create对象的时候直接调用这个构造函数即可:

var Man = funciton(name){
    this.name = name;
    };
var man = new Man("hopy");

如上所示man对象的类是Man,因为有:

Object.getPrototypeOf(man) === Man.prototype; //true

但是我们同样可以写一个类的工厂方法,用它来生成一个对象,显然该工厂方法不能用new来调用:

function Man_f(name){
    var props = {
        name:{value:name,enumerable:true,writable:true,configurable:true}
    };
    return Object.create(Man_f.prototype,props);
}
var man_f = Man_f("hopy");

以上2个方法分开来写略显繁琐,那么有没有可能把以上2个方法合成一个方法呢?那是必须的 :)
以下代码将Man和Man_f方法合并成一个Man方法,利用了这样一个事实:在使用new调用的构造器中this指向该类的一个实例:

function Man(name){
    var props = {
        name:{value:name,enumerable:true,writable:true,configurable:true}
    };
    if(this instanceof Man)
        Object.defineProperties(this,props);
    else
        return Object.create(Man.prototype,props);
}
//我们可以用任意一种方法来创建Man的实例
var man0 = new Man("hopy");
var man1 = Man("panda");

你可能感兴趣的:(JavaScript,类,构造函数,工厂方法)