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)