new和this

new和this

  当new一个新的数据的时候,new操作符的流程

    1、首先创建实例对象{}

    2、this变量引入该对象,同时还继承了构造函数的原型

    3、其次属性和方法被加入到this引用的对象中

    4、并且新创建的对象由this所引用,最后隐式的返回this

function objectFactory() {

    var obj = new Object(),//从Object.prototype上克隆一个对象

    Constructor = [].shift.call(arguments);//取得外部传入的构造器

    var F=function(){};
    F.prototype= Constructor.prototype;
    obj=new F();//指向正确的原型

    var ret = Constructor.apply(obj, arguments);//借用外部传入的构造器给obj设置属性

    return typeof ret === 'object' ? ret : obj;//确保构造器总是返回一个对象

};

  

 

  this对象的理解

    普通函数

      this总是指向函数的直接调用者

      如果有new关键字,this指向new出来的实例对象

      在事件中,this指向触发这个事件的对象

      IE下attachEvent中的this总是指向全局对象Window

      箭头函数中,函数体内的this对象,就是定义的时候所在作用域的对象,而不是使用的时候所在的作用域对象

function foo() {
  console.log(this.a)
}
var a = 1
foo()           //1       
​
const obj = {
  a: 2,
  foo: foo
}
obj.foo()      //2
​
const c = new foo()   //undefined

 

    对于直接调用foo来说,不管foo函数被放在了什么地方,this一定是window

    对于obj.foo()来说,我们只需要记住,谁调用了函数,谁就是this,所以在这个场景下foo函数中的this就是obj对象

    对于new的方式来说,this被永远绑定在了new出来的对象上,不会被任何方式改变this

 

  箭头函数中的this

function a() {
  return () => {
    return () => {
      console.log(this)
    }
  }
}
a()()()        //Window

 

 

    首先箭头函数其实是没有this的,箭头函数中的this只取决包裹箭头函数的第一个普通函数this。在这个例子中,因为包裹箭头函数的第一个普通函数是a,所以这个时候this指向的就是window。另外对箭头函数使用bind这类函数是无效的。

 

 

 

 

 

 

  

posted @ 2020-08-30 09:41  tulintao  阅读(474)  评论(0编辑  收藏  举报