js new运算符的本质


思路:

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, '-----')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值