對於前端開發者來說,this是乙個讓人又愛又恨的小妖精。應用得好,專案事半功倍,應用得不好,專案可能漏洞百出。接下來本文就將揭開this的神秘面紗。(鄙人第一次鼓足了膽子寫部落格,望路過的大神輕踩
首先強調的一點是,
在函式中this指向不是在定義的時候確定的,而是在真正執行此函式時確定的。
因為this的取值是執行上下文環境的一部分,每次呼叫函式,都會產生乙個新的執行上下文環境。
function pp()
var pp = new pp(); //pp
如上述**,當通過new關鍵字執行pp建構函式時,this的指向為即將new出去的物件,即這個物件。但如果不採用new關鍵字,即直接執行pp(),此時pp函式內的this將指向window。後面會說明。
第二種情況,函式作為物件的乙個屬性。
var obj = }
如上述**,當pp函式作為obj物件的乙個屬性被呼叫時,this的指向為obj物件。但如果pp不作為obj的乙個屬性被呼叫,那麼pp內this的指向將不再是obj,比如上面的fn()呼叫,this同樣將指向window。
var obj = ;
function pp()
pp.call(obj); //18
第四種情況,也是最常見的一種情況,呼叫普通函式。
(**被吞了,用展示
)如上述**,全域性環境或呼叫普通函式,this指向都為window。so第一種情況中,當把pp建構函式當做普通函式呼叫時,pp函式內的this同樣會指向為window。另外需要注意的一點是,上述obj.pp()**,pp函式被當做obj的乙個屬性呼叫,故其中的this指向為obj物件,但pp函式內的fn函式呼叫並非當做obj物件的乙個屬性,故fn函式內部的this指向為window。
js物件導向之繼承
原型鏈繼承 用法 把例項的父類給子函式的原型 缺點 1 因為修改了obj1.arr後obj2.arr也變了,因為來自原型物件的引用屬性裡所有例項共享的 2 建立子類例項時,無法向父類建構函式傳遞引數 1 function parent 78 function child age 1314 child...
js物件導向之物件建立篇
建立物件的方式 1.object建構函式或者物件字面量建立當物件 2.建構函式建立物件 3.工廠模式 4.原型模式 5.原型和建構函式組合模式 6.動態原型模式 7.寄生建構函式模式 8.穩妥建構函式模式 缺點使用乙個介面建立很多物件,會產生大量重複 這種模式抽象了建立具體物件的過程.考慮到在ecm...
JS物件導向之物件的屬性
1.屬性的設定和獲取通過 操作符或者 區別 操作符取自身的屬性,可以是變數 var o o.name 緣滅 var aaa name console.log o aaa 緣滅ps 一道比較坑的筆試題 var str abc str 1 var test typeof str if test.leng...