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