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