构造函数(function)可以使用 new 生成实例,箭头函数可以吗

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 构造函数使用 `new` 关键字可以生成实例对象,而箭头函数则不能用作构造函数,因为它没有自己的 `this` 上下文,使用 `new` 调用会抛出错误。

箭头函数不可以使用new来生成实例,而普通构造函数可以。

  1. 普通构造函数与new操作符
    • 当使用new关键字调用一个普通构造函数时,会发生以下几个步骤:
      • 创建一个新的空对象,这个对象的内部[[Prototype]]属性会被设置为构造函数的prototype属性。例如:
        function Person(name) {
                 
          this.name = name;
        }
        let p = new Person('John');
        console.log(p.__proto__ === Person.prototype); // true
        
      • 将构造函数内部的this指向这个新创建的对象。在函数体中,通过this来添加属性和方法到这个新对象上。例如在Person函数中,this.name = name就是给新对象添加了一个name属性。
      • 如果构造函数没有显式返回一个对象,则自动返回这个新创建的对象。所以let p = new Person('John');返回的p就是包含name属性的新对象。
  2. 箭头函数的特性导致不能使用new
    • 箭头函数没有自己的this,它的this是从外层作用域继承而来的。当使用new操作符时,需要创建一个新的对象并将其绑定到this,但箭头函数本身没有这个机制。
    • 箭头函数也没有prototype属性。构造函数的prototype属性用于定义通过new创建的对象所继承的属性和方法,由于箭头函数没有这个属性,所以无法像普通构造函数那样为新对象设置原型链。
    • 例如,下面的代码会报错:
      let ArrowPerson = (name) => {
             
        this.name = name;
      };
      let p = new ArrowPerson('Alice');// 报错:ArrowPerson is not a constructor
      
    • 这里的ArrowPerson被当作构造函数使用,但是由于箭头函数的特性,它无法完成new操作所需要的步骤,所以会抛出错误。
相关文章
|
中间件
解构如何运用的解构--报错 throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
解构如何运用的解构--报错 throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
解构如何运用的解构--报错 throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
|
JavaScript 前端开发
|
JavaScript 前端开发
Function() 构造函数
Function() 构造函数
58 0
|
存储 SQL 负载均衡
SQL 函数 function 讲解+代码实例
SQL 函数 function 讲解+代码实例
SQL 函数 function 讲解+代码实例
|
JSON 自然语言处理 JavaScript
深入理解Js里new Function语法
深入理解Js里new Function语法
|
JavaScript 中间件
node.js 报错 throw new TypeError(‘app.use() requires a middleware function‘)
node.js 报错 throw new TypeError(‘app.use() requires a middleware function‘)
496 0
|
前端开发 JavaScript