咱們都學過javascript的面向對象,在我學習的過程當中,一度有個問題困擾着我,那就是在構造函數中,若是使用了this,那麼這個this指向的是誰?若是在定義的原型方法中使用了this,那麼這個this又指向誰了?是構造函數、原型、仍是實例?究竟是誰在決定?javascript
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.getName = function() {
return this.name;
}
var p1 = new Person('pan', 18);
p1.getName();複製代碼
構造函數其實就是普通的函數,而this是在函數運行時才肯定的。那麼是什麼致使構造函數變得如此特別了?java
與new 關鍵字有關bash
若是咱們自定義一個New方法,來模擬關鍵字new的能力,那麼會有以下實現(在此以前請先回憶一下new 一個函數 會發生什麼.,若是您沒有想起來,那就記住new一個函數,生成一個實例對象)。app
//將構造函數以參數形式傳入
function New(func) {
//聲明一箇中間對象,該對象爲最終返回的實例
var res = {};
if(func.prototype !== null) {
//將實例的原型指向構造函數的原型
res.__proto__ = func.prototype;
}
//ret爲構造函數執行的結果,這裏經過apply,
//將構造函數內部的this指向修改成指向res,即爲實例對象
var ret = func.apply(res, Array.prototype.slice.call(arguments,1))
//當在構造函數中明確指定了返回對象時,那麼new的執行結果就是該返回對象
if((typeof ret === 'object' || typeof ret === 'function') && ret !== null) {
return ret;
}
//若是沒有明確指定返回對象,則默認返回res,這個res就是實例對象
return res;
}複製代碼
爲了方便你們理解,例子中作了一些註解。經過New 方法的實現能夠看出,執行時,利用apply設定了傳入的構造函數的this指向,所以當使用New方法建立實例時,構造函數中的this就指向了被建立的實例。函數
若是把當前函數當作基礎函數,那麼高階函數,就是讓當前函數得到額外能力的函數。若是把構造函數當作基礎函數,那麼New方法,就是構造函數的高階函數。構造函數本就和普通函數同樣,沒有什麼區別。可是由於New的存在,它得到了額外的能力。New方法每次執行都會建立一個新的中間對象,並將中間對象的原型指向構造函數的原型,將構造函數的this指向該中間對象。這樣統一邏輯的封裝,就是高階函數的運用。學習
固然,若是簡單粗暴一點來理解,則凡是接收一個函數做爲參數的函數,就是高階函數。可是若是這樣理解,那麼咱們仍是用很差高階函數。由於正如陽波大神所說,高階函數實際上是一個高度封裝的過程,理解它須要點想象力。那麼在接下來的系列中,就藉助幾個例子,來理解高階函數的封裝。ui