思路:
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, '-----')