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

JS中关于为什么调用构造函数要使用new的详细解读

在 JavaScript 中,使用 new 关键字调用构造函数是创建新对象的关键步骤。本文将从以下几个方面解释为什么要这样做:

1. 创建一个新的对象

当你用 new 调用构造函数时,会自动创建一个新的空对象,这个对象会被赋值给 this,即构造函数内部的 this 关键字会引用这个新创建的对象。

function Person(name) {// this = {};  // 隐式地发生this.name = name;// return this;  // 隐式地发生
}const person1 = new Person('Alice');
console.log(person1.name);  // 输出: Alice

2. 链接原型

新创建的对象会自动链接到构造函数的 prototype 对象。这意味着新对象会继承构造函数的原型对象上的所有属性和方法。

function Person(name) {this.name = name;
}Person.prototype.greet = function() {console.log(`Hello, my name is ${this.name}.`);
};const person1 = new Person('Alice');
person1.greet();  // 输出: Hello, my name is Alice.

3. 绑定 this

在使用 new 调用构造函数时,构造函数内部的 this 会自动绑定到新创建的对象。如果不使用 newthis 将指向全局对象(在浏览器中是 window),或者在严格模式下会是 undefined

function Person(name) {this.name = name;
}const person1 = new Person('Alice');
console.log(person1.name);  // 输出: Alice// 不使用 `new`
const person2 = Person('Bob');
console.log(person2);  // 输出: undefined,因为函数没有返回值
console.log(window.name);  // 输出: Bob (非严格模式下)

4. 返回对象

通常情况下,构造函数不需要显式地 return 新创建的对象,因为它是隐式返回的。如果构造函数中有 return 语句,并且返回的是一个对象,那么该对象将会覆盖默认返回的新对象。

function Person(name) {this.name = name;return { name: 'Override' };  // 显式返回一个新对象
}const person1 = new Person('Alice');
console.log(person1.name);  // 输出: Override

但是,如果返回的不是对象,而是一个基本类型(如字符串、数字),new 仍然会返回新创建的对象。

function Person(name) {this.name = name;return 'Override';  // 返回一个字符串,`this` 不会被覆盖
}const person1 = new Person('Alice');
console.log(person1.name);  // 输出: Alice

总结

使用 new 调用构造函数能够确保以下几个重要步骤的发生:

  1. 创建一个新对象。
  2. 将新对象的原型链接到构造函数的原型对象。
  3. 绑定 this 到新创建的对象。
  4. 隐式地返回这个新对象。

这些特性使得构造函数可以方便地用于对象的创建和初始化。如果不使用 new 调用构造函数,以上步骤将不会自动发生,这可能导致意外的行为或错误。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • stm32程序调试方式(OLED显示屏调试以及Keil调试模式)
  • lwip 3. 网线拔掉后 lwip_recvfrom不能返回
  • ECMAScript 6 入门 学习 日志笔记 2024/8/6 13:59
  • 【Transformer】关于RNN以及transformer的相关介绍
  • uniapp3.0实现图片上传公用组件上传uni-file-picker,uni.uploadFile
  • Mac电脑装不了软件怎么办 苹果电脑软件安装失败解决办法 安装macos空间不足
  • 【开源社区】Elasticsearch(ES)中空值字段 null_value 及通过exists查找非空文档
  • 【MySQL】全面剖析索引失效、回表查询与索引下推
  • 【开端】web系统中返回状态码组织管理
  • 回顾Python
  • 在树莓派上安装udhcpd的步骤
  • 2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第三弹视觉模块的封装
  • 打造核心竞争力:中集集团技术创新之路
  • 【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践(辩论赛)构建】
  • 十九、虚拟机VMware Workstation(CentOSDebian)的安装
  • JS专题之继承
  • leetcode-27. Remove Element
  • Making An Indicator With Pure CSS
  • Mybatis初体验
  • React中的“虫洞”——Context
  • Redux系列x:源码分析
  • Web Storage相关
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 代理模式
  • 工程优化暨babel升级小记
  • 前端js -- this指向总结。
  • 前端知识点整理(待续)
  • 系统认识JavaScript正则表达式
  • 学习笔记:对象,原型和继承(1)
  • 一、python与pycharm的安装
  • 应用生命周期终极 DevOps 工具包
  • 栈实现走出迷宫(C++)
  • gunicorn工作原理
  • 大数据全解:定义、价值及挑战
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • $jQuery 重写Alert样式方法
  • (javascript)再说document.body.scrollTop的使用问题
  • (二)构建dubbo分布式平台-平台功能导图
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (利用IDEA+Maven)定制属于自己的jar包
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转载)从 Java 代码到 Java 堆
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .a文件和.so文件
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net 发送邮件
  • .Net 垃圾回收机制原理(二)