编辑代码

// 取出第一个参数,就是我们要传入的构造函数。此外因为 shift 会修改原数组,所以 arguments 会被去除第一个参数
// 将 obj 的原型指向构造函数,这样 obj 就可以访问到构造函数原型中的属性
// 使用 apply,改变构造函数 this 的指向到新建的对象,这样 obj 就可以访问到构造函数中的属性
// 返回 obj或构造器函数的返回值
function objectFactory(){
    Constructor = [].shift.call(arguments);
    obj = Object.create(Constructor.prototype);
    let ret = Constructor.apply(obj,arguments);
    return typeof ret === 'object' ? ret : obj;
}
function Otaku (name, age) {
    this.name = name;
    this.age = age;

    this.habit = 'Games';
}

Otaku.prototype.strength = 60;

Otaku.prototype.sayYourName = function () {
    console.log('I am ' + this.name);
}
var person = objectFactory(Otaku, 'Kevin', '18')
var per = objectFactory(Otaku,'dd',16)

per.sayYourName()