this指向问题、new的过程

this指向问题

在浏览器里,在全局范围内this 指向window对象;
在函数中,this永远指向最后调用他的那个对象;
构造函数中,this指向new出来的那个新的对象;
call、apply、bind中的this被强绑定在指定的那个对象上;
箭头函数中this比较特殊,箭头函数this为父作用域的this,不是调用时的this.要知道前四种方式,都是调用时确定,也就是动态的,而箭头函数的this指向是静态的,声明的时候就确定了下来;
apply、call、bind都是js给函数内置的一些API,调用他们可以为函数指定this的执行,同时也可以传参。

new的过程

1. new的四个步骤

创建一个空对象—>这个新对象继承原函数的原型—>更改this指向,为对象设置属性—>返回新对象

  1. 创建一个空对象

var obj={}

  1. 这个新对象继承原构造函数的原型

obj.proto=Constructor.protype

  1. 更改this指向,为对象设置属性

let result=Constructor.apply(obj,…args)

  1. 返回新对象

return result instanceof Object?result : obj

2. new的实现过程

function myNew(constrc, ...args) {
 
    // 1. 创建一个空对象
    const obj = {}; 
 
    // 2. 将obj的_proto_属性指向构造函数的原型对象
    obj.__proto__ = constrc.prototype; 
    
    // 3.将constrc执行的上下文this绑定到obj上,并执行
    const result = constrc.apply(obj, args);
 
    //4. 如果构造函数返回的是对象,则使用构造函数执行的结果。否则,返回新创建的对象
    return result instanceof Object ? result : obj; 
 
}
  1. 像普通函数那样执行,形成私有作用域,进行形参赋值,变量提升等一系列操作
  2. 默认创建一个对象,
  3. 让这个对象成为当前类的实例,__proto__指向构造函数原型
  4. 让函数中的this指向这个对象
  5. 代码执行
  6. 默认把创建的对象返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值