模擬個new

// 手寫 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章