普通函数和构造函数的区别

1,001 阅读1分钟

写在前面

在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
    }