new 执行原理
        【摘要】 new执行的特点:和普通函数执行一样,形成私有的上下文(Ao对象)作用域链初始化this(让this指向创建的对象)形成赋值初始化arguments变量提升代码执行区别:new函数执行,会在代码执行之前,创建一个对象初始化this(让this指向创建的对象)如果没有写return默认把创建的对象返回,如果写了如果是返回的是基本类型值,也不以直接的为主,返回的还是创建的这个对象如果是返回的引用...
    
    
    
    new执行的特点:
- 和普通函数执行一样,形成私有的上下文(Ao对象)
 - 作用域链
 - 初始化this(让this指向创建的对象)
 - 形成赋值
 - 初始化arguments
 - 变量提升
 - 代码执行
 
区别:
- new函数执行,会在代码执行之前,创建一个对象
 - 初始化this(让this指向创建的对象)
 - 如果没有写return默认把创建的对象返回,如果写了 
  
- 如果是返回的是基本类型值,也不以直接的为主,返回的还是创建的这个对象
 - 如果是返回的引用类型值,则是以直接返回的值为主
 
 
后期在代码执行的时候遇到this.xxx=xxx就是给创建的对象创建"私有"的属性方法(只有this.xxx才和对象有关联,其他的变量都和对象没有直接的关系,他们都是私有上下文中的私有变量)
new XXX() XXX不再称为普通函数,叫做构造函数(也叫类:‘自定义类’)处理过程中创建的对象,是当前类的一个实例 0x000000是当前类的实例对象。this.xxx=xxx都是给当前实例对象设置的私有属性方法,默认返回的结果就是这个实例对象(除非手动返回引用类型值替换了它)
new Fn;也会执行Fn,不带参数列表的new 优先级18 new Fn();带参数列表的new 优先级19 最后Fn都会执行,而且会创建这个类的实例,区别:是否传递参数,以及运算优先级不一样
内置类
- 所有类都是一个函数数据类型的值(构造函数):内置类/自定义类
 - typeof Object => "function"
 
每一次new 类 创造的实例都是“独立的实例对象”
重写new
function _new(Func,...args){
    //1.创建一个Func的实例对象 Func.prototype === 实例对象.__proto__
    //ie浏览器中禁止使用__proto__(ie并没有提供给我们这个属性,防止我们去改变原型指向)
    //var obj = {};
   // obj.__proto__ === Func.prototype;
   
   var obj = Object.create(Func.prototype)
    
    //2.把Func当做普通函数执行(让方法中的this指向创建的实例)
    
    var result = Func.call(obj,...args);
    //3.分析函数指向的返回值(没有返回值或者返回的是原始值类型则默认都返回创建的实例,否则以函数自身返回的为主)
    if(result!==null && /^(object|function)$/.test(typeof result){
       return result; 
    }
    return obj;
}
_new(Doc,'旺财');//传进一个类就要创建实例
Object.create(【object】)
创建一个空对象x,并且把【object】这个值需要是一个对象作为新对象的原型指向
x.__proto__ == [object]
Object.create(null);创建一个没有原型/原型链的空对象(不是任何类的实例)
重写Object.create(【object】)
//创建一个空对象,并且让空对象的原型指向传入的参数(对象)
   function create(prototype){
       if(prototype ===null || typeof prototype!=='object'){
           throw new TypeError(`Object prototype may only be an Object:${prototype}`)
       }
       //创建一个类,创建这个类的实例,实例.__proto__=类.prototype;我们让类.prototype=参数.prototype
       function Temp(){};
       Temp.prototype==prototype;
       return new Temp;
   }
        
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)