zoukankan      html  css  js  c++  java
  • 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
    
    
    

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

    原文地址:https://segmentfault.com/a/1190000016718620

  • 相关阅读:
    校门外的树
    年龄与疾病
    数组逆序重放
    计算书费
    陶陶摘苹果
    与指定数字相同的数的个数
    上学路线
    NOIP2011 普及組 統計單詞數
    [HAOI2012]音量调节
    [USACO11JAN]利润Profits
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9906558.html
Copyright © 2011-2022 走看看