当前位置: 首页 > article >正文

「JavaScript深入」聊一聊 new操作符具体干了什么?

JavaScript深入 — new操作符

    • 概念
    • 流程
    • 手写new操作符


在这里插入图片描述

概念

在JavaScript中,new 操作符用于创建一个给定构造函数的实例对象

function Person(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype.sayName = function () {
  console.log(this.name)
}
const person1 = new Person('Tom', 20)
console.log(person1)  // Person {name: "Tom", age: 20}
t.sayName() // 'Tom'

👆 可知:

  • new 通过构造函数 Person 创建出来的实例可以访问到构造函数中的属性
  • new 通过构造函数 Person 创建出来的实例可以访问到构造函数原型链中的属性(即实例与构造函数通过原型链连接了起来)

👇 构造函数中返回一个原始值,然而这个返回值并没有作用

function Test(name) {
  this.name = name
  return 1
}
const t = new Test('xxx')
console.log(t.name) // 'xxx'

👇 构造函数如果返回值为一个对象,那么这个返回值会被正常使用

function Test(name) {
  this.name = name
  console.log(this) // Test { name: 'xxx' }
  return { age: 26 }
}
const t = new Test('xxx')
console.log(t) // { age: 26 }
console.log(t.name) // 'undefined'

流程

new 关键字的流程如下:

  • 创建一个新的对象 obj

    //创建一个新的空对象
    {}
    
  • 将对象与构造函数通过原型链连接起来

    //将新对象的[[prototype]]指向为Person.prototype
    {
      __proto__ = Person.prototype;
    }
    
  • 将构造函数中的this绑定到新建的对象 obj

    //将Person构造函数的this设置为新创建的对象,执行
    {
      __proto__ = Person.prototype;
      name = 'Tom';
      age = 20;
    }
    
  • 根据构造函数的返回类型作判断,如果是原始值则被忽略,如果返回对象,需要正常处理

    //构造函数Person没有return对象的话,将该新创建的对象返回
    const person = {...}
    

👻 具体流程图如下:

在这里插入图片描述


手写new操作符

function myNew(Func, ...args) {
  //创建一个新对象
  const obj = {};
  //新对象原型指向构造函数原型对象
  Object.setPrototypeOf(obj, Func.prototype);
  //将构建函数的this指向新对象
  const result = Func.apply(obj, args);
  //根据返回值判断
  return result !== undefined ? result : obj;
}

👇 测试代码

function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.say = function () {
  console.log(this.name);
};

let p = myNew(Person, "huihui", 123);
console.log(p); // Person {name: "simon", age: 123}
p.say(); // simon

http://www.kler.cn/a/322200.html

相关文章:

  • Springboot Mybatis操作数据库
  • 高精度图像尺寸测量仪(闪测仪)测量内径深度
  • CSS的弹性盒子模型(Flex box)
  • 【Hive】学习路线:架构、运维、Hsql实战、源码分析
  • 如何将Excel表格嵌入Web网页在线预览、编辑并保存到自己服务器上?
  • 大数据毕业设计选题推荐-安顺旅游景点数据分析系统-Hive-Hadoop-Spark
  • docker-compose up -d 和 docker run -d your_image_name 的区别
  • 原生app云打包,更换图标,和名称。PDA的安装正式包
  • web入门
  • Codeforces Round 972 (Div. 2) A~E
  • 事务 Atomicity Consistency Isolation Durability
  • 七大机器学习常用库一次讲清楚(TensorFlow|Scikit-Learn|NumPy|Keras|PyTorch|LightGBM||NLTK)
  • 局域网广域网,IP地址和端口号,TCP/IP 4层协议,协议的封装和分用
  • html+css(如何用css做出京东页面,静态版)
  • SQL关键字的优先级执行顺序:深入理解SQL查询的构造
  • Debian安装mysql遇到的问题解决及yum源配置
  • 常用前端框架对比和选择
  • Mac pnpm安装
  • 爬虫小案例:爬取豆瓣网TOP250的电影信息(内含面相对象源码、及详细教学)
  • 【中级通信工程师】终端与业务(八):市场营销战略