思路:

1️⃣new运算符后边跟一个函数,返回一个对象,这个对象可以访问这个函数的原型
2️⃣new后边的函数this指向这个返回的对象

两个辅助函数

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
}
Object.create = function (o) {
    var F = function () { };
    F.prototype = o;
    return new F();
}

第一步可以通过create方法创建一个对象继承这个函数的原型。
第二步可通过apply把函数内部的this指向这个创建的对象

如果new运算符是一个方法而不是一个运算符,它可能会像这样执行:

 Function.method('new', function () {
 	//创建一个新对象,它继承自构造函数的原型对象。
     var that = Object.create(this.prototype);
     /* 在下边例子中this指的是Mammal函数 此时的that有了this的原型get_name和say方法 */
 	//调用构造函数,绑定到this这个新对象上
     var other = this.apply(that, arguments);
     /* 在下边的例子中相当于是执行了that.Mammal('Herb the Mammal') 此时的that有了name属性 */
     return  that;
 })

测试

定义一个构造器并扩充它的原型:

var Mammal = function(name){
    this.name = name
};

Mammal.prototype.get_name = function(){
    return this.name;
}

Mammal.prototype.say  = function(){
    return this.saying || ''
};

调用new

var myMammal = Mammal.new('Herb the Mammal')
var name = myMammal.get_name()
console.log(myMammal, name, '-----')



完整代码

Function.prototype.method = function (name, func) {
 this.prototype[name] = func;
    return this;
}
Object.create = function (o) {
    var F = function () { };
    F.prototype = o;
    return new F();
}

Function.method('new', function () {
    var that = Object.create(this.prototype);

    var other = this.apply(that, arguments);

    return (typeof other === 'object' && other) || that;
})

var Mammal = function(name){
    this.name = name
};

Mammal.prototype.get_name = function(){
    return this.name;
}

Mammal.prototype.say  = function(){
    return this.saying || ''
};

var myMammal = Mammal.new('Herb the Mammal')
var name = myMammal.get_name()
console.log(myMammal, name, '-----')