new命令的原理

function Person(name, age) {
    this.name = name;
    this.age = age
}

var person = new Person('小明', 18);
console.log(person.name);  //小明
console.log(person.age);   //18

执行new命令会经过以下几个步骤

  1. 创建一个空对象,这个对象将会是new Person()返回的对象实例;
  2. 将这个空对象的原型指向构造函数prototype属性;
  3. 构造函数this指向空对象,并运行构造函数;
  4. 判断构造函数返回的是不是对象,是的话返回默认对象,不是的话返回之前创建的空对象,没有返回值默认返回空对象

用代码解释一下

function Person(name, age) {
    this.name = name;
    this.age = age
    //return '小明' //如果返回的不是Object类型,将忽略这个return 返回之前创建的空对象
   /* return {     //如果返回的是Object类型,直接返回这个对象
        'name' : '小花',
        'age' : 22
    } */
}

function _new(person, ...rest){
    var obj = {};  // 创建一个空对象,这个对象将会是返回的对象实例
    obj.__prototype__ = person.prototype; // 将这个空对象的原型指向person的prototype属性;
    //上述两步可以合为一步 :  var obj = Object.create(person.prototype)  
   
    var res = person.apply(obj, rest);  // 将person的this指向空对象,并运行person函数,apply命令绑定this后就会运行person
    return (typeof res === 'object' && res != null) ? res: obj;
    // 判断res返回的是不是对象,是的话返res,不是的话返回之前创建的obj,没有返回值默认返回obj
}

var xiaoming = _new(Person, '小明', 15)
console.log(xiaoming .name);  //小明
console.log(xiaoming .age);   //15

本篇如能对您有所帮助,实在是感到荣幸。如有不合理之处也请大家多多指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值