// 手寫 new
// 分析 new具體幹了啥
var Func = function (a) {
this.a = a
return 10
};
var func = new Func();
console.log(func)
/**
* 首先他肯定是創建了一個新對象obj(這就是你創建的實例對象)
* 執行了Func函數體,並且把指向obj (實例對象)
* 然後把obj的原型 指向 Func的prototype
* 判斷Func的返回值類型。如果是值類型,就返回obj。如果是引用類型,就反返回這個引用類型
*/
/**
* 按照這個思路去模擬一個new
*/
function newFunc () {
// 首先他肯定是創建一個新對象obj
var obj = new Object()
// 獲取到 Func
// 並完成第二步:執行了Func函數體,並且把指向obj (實例對象)
const func = [].shift.call(arguments)
// 爲啥 直接把 arguments 傳過去,因爲Array.shift()操作會影響到原數組。
// 所以此時的 arguments已經去除了Func
const result = func.apply(obj, arguments)
// 然後把obj的原型 指向 Func的prototype
obj.__proto__ = Func.prototype
// 判斷Func的返回值類型。如果是值類型,就返回obj。如果是引用類型,就反返回這個引用類型
return typeof result === 'object' ? result : obj
}
var func1 = newFunc(Func, 10)
console.log(func1)
模擬個new
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.