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

「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 = namereturn 1
}
const t = new Test('xxx')
console.log(t.name) // 'xxx'

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

function Test(name) {this.name = nameconsole.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.mrgr.cn/news/37689.html

相关文章:

  • 基于keras 的神经网络股价预测模型
  • 2024/9/27刷题记录(cf1800 - 2000)
  • 数据工程师岗位常见面试问题-1(附回答)
  • QML使用Qt自带软键盘例子
  • Rust SQLite 跨平台使用
  • 《向量数据库指南》——非结构化数据迁移服务的核心能力
  • `pattern = r“(\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)“
  • 选择更轻松:山海鲸可视化与PowerBI的深度对比
  • idea插件通义灵码
  • CUDAExample: 波纹示例
  • 敏感字段加密 - 华为OD统一考试(E卷)
  • 了解网络的相关信息
  • 环形链表的约瑟夫问题
  • 华为 HCIP-Datacom H12-821 题库 (27)
  • 【C++】函数模板,类模板,全特化,偏特化详解
  • FPGA学习(3)-38译码器实现
  • WEB3.0是什么?
  • [element-ui]记录对el-table表头样式的一些处理
  • 【SQLite】sqlite | insert插入存在即更新
  • 【C#生态园】解锁C#开发新姿势:探秘六大Word处理库功能对比