new 执行原理

举报
yk02901 发表于 2021/05/17 21:43:47 2021/05/17
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。