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這類函數是無效的。

 

 

 

 

 

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章