写在前面
在JavaScript中函数和构造函数的区别
1.构造函数也是一个普通函数,创建方式和普通函数一样,但是构造函数习惯上首字母大写。
2.调用方式不一样,普通函数直接调用,构造函数要用关键字new来调用。
3.调用时,构造函数内部会创建一个新对象,就是实例,普通函数不会创建新对象。
4.构造函数内部的this指向实例,普通函数内部的this指向调用函数的对象(如果没有对象调用,默认为window)。
5.构造函数默认的返回值是创建的对象(也就是实例),普通函数的返回值由return语句决定。
6.构造函数的函数名与类名相同。
在new的时候发生了什么
new内部:
- 创建一个新对象
- 使新对象的__proto__指向原函数的prototype
- 改变this指向(指向新的obj)并执行该函数,执行结果保存起来作为result
- 判断执行函数的结果是不是null或Undefined,如果是则返回之前的新对象,如果不是则返回result
手写实现一个 new
// 手写一个new
function myNew(fn, ...args) {
// 创建一个空对象
let obj = {}
// 使空对象的隐式原型指向原函数的显式原型
obj.__proto__ = fn.prototype
// this指向obj
let result = fn.apply(obj, args)
// 返回
return result instanceof Object ? result : obj
}