js小题3:构造函数介绍与普通函数对比

news2024/12/23 12:33:47

一、构造函数介绍:

JavaScript中,构造函数是用于创建和初始化一个由new关键字生成的对象的特殊函数。构造函数的名字通常以大写字母开头,但这并不是JavaScript语法的一部分,而是一种约定俗成的命名规范,有助于区分构造函数和普通函数。

  • 示例:
function Person(name, age) {  
    this.name = name;  
    this.age = age;  
  
    // 还可以添加其他方法和属性  
    this.say= function() {  
        console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);  
    };  
}  
  
// 使用new关键字和构造函数创建一个新的Person对象  
var obj = new Person('xiaoming', 30);  
  
// 访问对象的属性和方法  
console.log(obj.name); // 输出: xiaoming
console.log(obj.age);  // 输出: 30  
obj.say();            // 输出: Hello, my name is xiaoming and I'm 30 years old.

在上面的例子中,Person是一个构造函数,它接受两个参数nameage,并使用this关键字来设置新创建对象的属性。this在构造函数中引用的是新创建的对象。

构造函数的一个常见错误是忘记使用new关键字来调用它们。如果忘记使用new,那么this将不会引用新创建的对象,而是引用全局对象(在浏览器中是window对象)。这通常会导致意外的全局变量和难以调试的错误。
image.png

二、构造函数特点

  1. 命名约定:
    构造函数的命名通常以大写字母开头,以区分它们与其他函数(尽管这不是强制性的,但遵循这个约定可以提高代码的可读性)。
  2. 使用new关键字:
    当你使用new关键字和一个构造函数时,JavaScript会创建一个新的空对象,将这个新对象的[[Prototype]](内部链接)链接到构造函数的prototype对象上,然后将this关键字绑定到这个新对象上,并执行构造函数中的代码。
  3. this关键字:
    在构造函数内部,this关键字引用的是新创建的对象实例。你可以使用this来设置新对象的属性或方法。
  4. prototype属性:
    每个构造函数都有一个prototype属性,它是一个对象,用于存储所有实例共享的属性和方法。当你创建一个新对象时,这个新对象会继承构造函数的prototype对象上的属性和方法。
  5. 返回值:
    通常,构造函数不返回任何值(或返回this,这是隐式的)。然而,如果构造函数显式地返回了一个非原始值(如对象或数组),那么这个值将替代新创建的对象作为new表达式的返回值。但是,如果返回的是原始值(如numberstringbooleannullundefined),那么新创建的对象仍然会被返回。
  6. 继承:
    JavaScript中的继承通常通过修改原型链或使用ES6中的class语法(它是基于原型链的语法糖)来实现。构造函数可以通过其prototype属性参与原型链,从而允许子类继承父类的属性和方法。

三、简易实现

示例1:

// 假如一个普通函数Person
function Person(name, age) {  
    const obj = {};
    obj.name = name;  
    obj.age = age; 
    obj.__proto__ = Person.prototype
    return obj
}  

const a = Person('a', 20)

image.png

示例2:

// 定义构造函数Person
function Person(name, age) {  
    this.name = name;  
    this.age = age; 
}  

const a = new Person('a', 20)

image.png

四、与普通函数区别

构造函数(Constructor Functions)和普通函数(Regular Functions)主要差异:

  1. 使用 new 关键字:
    • 构造函数通常与 new 关键字一起使用来创建和初始化对象。当使用 new 关键字调用一个函数时,这个函数就被当作构造函数来使用。
    • 普通函数则不需要使用 new 关键字来调用,它们通常用于执行某些操作或返回某个值。
  2. this 的行为:
    • 在构造函数中,this 关键字引用的是通过 new 创建的新对象。构造函数内部通常使用 this 来为新对象添加属性和方法。
    • 在普通函数中,this 的值取决于函数如何被调用。如果函数作为普通函数调用,this 通常指向全局对象(在浏览器中是 window)。但如果函数作为对象的方法被调用,this 将指向调用该方法的对象。此外,还可以使用 Function.prototype.callFunction.prototype.apply 或箭头函数来显式设置 this 的值。
  3. 返回值:
    • 如果构造函数没有显式地返回一个对象,那么 new 表达式将返回新创建的对象。如果构造函数显式地返回了一个非原始值(如对象或数组),那么这个值将替代新创建的对象作为 new 表达式的返回值(但这种情况很少见,通常不建议这样做)。
    • 普通函数可以返回任何类型的值,包括原始值和对象。返回值由函数体内的 return 语句确定。
  4. 命名约定:
    • 虽然JavaScript并没有强制要求构造函数和普通函数有不同的命名方式,但按照惯例,构造函数通常使用大驼峰命名法(PascalCase),即首字母大写的命名方式(例如 PersonCar 等)。
    • 普通函数则可以使用任何有效的命名方式,但通常使用小驼峰命名法(camelCase),即首字母小写的命名方式(例如 calculateSumgreetUser 等)。
  5. 目的:
    • 构造函数的主要目的是创建和初始化对象,为新对象设置属性和方法。
    • 普通函数则用于执行各种任务,如计算、数据处理、逻辑判断等。
  6. 原型链:
    • 构造函数与原型链密切相关。每个构造函数都有一个 prototype 属性,这个属性是一个对象,包含可以由构造函数创建的所有实例共享的属性和方法。通过原型链,我们可以实现继承和其他面向对象的编程模式。
    • 普通函数也可以有原型,但它们的原型通常不用于创建实例共享的属性和方法。
  7. instanceof 操作符:
    • 由于构造函数创建的实例与构造函数之间存在一种特殊的联系,因此我们可以使用 instanceof 操作符来检测一个对象是否由某个构造函数创建
    • 普通函数与它们调用的结果之间不存在这种联系,因此不能使用 instanceof 操作符来检测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML基础入门知识

HTML基础使用 文章目录 HTML基础使用1、什么是HTML2、web标准4、HTML语法规则5、常用的标签标题标签段落标签换行标签文本格式化标签div和span标签图片标签路径链接标签注释 1、什么是HTML 什么是网页 网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示…

国内有哪些比较优秀的wordpress主题?

WordPress作为全球最受欢迎的开源内容管理系统之一,拥有众多优质的主题供用户选择。那么国内有哪些比较优秀的wordpress主题呢?下面小编就和大家分享国内功能比较完善比较受欢迎的wordpress主题。 wordpress主题合集:WP主题-办公人导航https:…

202406最新manjaro安装sogou输入法解决方案(采用aur本地package+sogou deb包解决方案)

本地执行安装方法 1.拉取源码 git clone https://gitee.com/liushuai05/fcitx-sogoupinyin.git cd fcitx-sogoupinyin 2.获取sogou下载地址并替换到源码中 - 下载地址:https://pinyin.sogou.com/linux/ - 点击立即下载->x86_64->下载,然后右键复…

【数据结构(邓俊辉)学习笔记】二叉搜索树02——查找、插入和删除

文章目录 1.概述2. 查找2.1 查找:算法2.2 查找:理解2.3 查找:实现2.4 查找:语义 3. 插入3.1 插入:算法3.2 插入:实现 4. 删除4.1 删除:框架4.2 删除:单分支4.3 删除:双分…

数据库讲解---(数据库保护)【上】

目录 一.事务 1.1事务的概念【重要】 1.2事务的特性【重要】 1.2.1原子性(Atomicity) 1.2.2一致性(Consistency) 1.2.3隔离性(Isolation) 1.2.4持久性(Durability) 二.数据库恢复 2.1数据库系统的故障 2.1.1事务内部故障 2.1.2系统故障 2.1.3介质故障 2.1.4计算机…

基于轨迹加权的混合离线强化学习数据集

写在前面: 这篇论文阅读已经同步到我的博客网站,若需更优的阅读体验,请前往https://mainjaylai.github.io/Blog/blog/paper/trajectory-dataset进行浏览 摘要 大多数离线强化学习(RL)算法通过最大化目标策略的期望性…

基因检测2 - 脆性X综合征

1. 脆性X综合征 脆性X综合征(Fragile X syndrome, FXS)遗传性智力障碍和孤独症谱系障碍(Autism spectrum disorder, ASD)最常见的单基因病(发病率仅次于唐氏综合征Down syndrome, DS),为X连锁不…

总结一些LLM算法岗遇到的八股

总结一些我被问到的题和常见的题目,答案有不对的欢迎指出。 Batch Norm和Layer Norm的定义及区别? BN 批量归一化:以进行学习时的mini-batch为单位,按mini-batch进行正规化。具体而言,就是进行使数据分布的均值为0、…

C语言入门课程学习笔记9:指针

C语言入门课程学习笔记9 第41课 - 指针:一种特殊的变量实验-指针的使用小结 第42课 - 深入理解指针与地址实验-指针的类型实验实验小结 第43课 - 指针与数组(上)实验小结 第44课 - 指针与数组(下)实验实验小结 第45课 …

工信部中小企业局一行莅临盘古信息调研指导

近日,中小企业数字化转型城市试点调研交流活动在广东东莞举行,工业和信息化部中小企业局副局长商超,广东工业和信息化厅二级巡视员张振祥,工业和信息化部中小企业局创业创新处处长李海涛,东莞市委常委、副市长刘光滨&a…

canvas如何让单行文本用...省略

let strWidth ctx.measureText(this.data.name).width; const ellipsis "..." const ellipsisWidth ctx.measureText(ellipsis).width; if(strWidth<120 || 120<ellipsisWidth) {ctx.fillText("测试:"this.data.name, 190*dpr,590*dpr); }else {va…

(上位机APP开发)调用华为云属性修改API接口修改设备属性

一、功能说明 通过调用华为云IOT提供的属性修改API接口,给设备下发属性修改消息。 API接口地址:https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html 此接口支持在线调试:https://console.huaweicloud.com/apiexplorer/#/openapi/IoTDA/doc?api=UpdatePrope…

基于Java微信小程序火锅店点餐系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

基于电商模式的性能测试(2) —— 使用Jmeter参数化功能+JSR223 PreProcessor+JSON Extractor完成注册登录的数据驱动

1、前置条件 此例使用的是GitHub上一个开源的电商项目mall&#xff0c;需要的可以去GitHub上下载部署&#xff0c;有详细的部署教程&#xff1a; GitHub地址&#xff1a;github.com/macrozheng/…部署教程&#xff1a;macrozheng.github.io/mall-learni… 2、场景抽离 首先要…

全国首场以AI数字内容风控为主题的大会正式官宣,首批演讲嘉宾和议题揭晓!

曾经我们感叹的“AI迎来了iPhone时刻”&#xff0c;如今已变成“iPhone迎来了AI时刻”。前段时间&#xff0c;苹果全球开发者大会的召开&#xff0c;以及闻声而起的资本市场&#xff0c;无一不再次佐证了AI的无穷想象。 从OpenAI直播演示GPT-4o和谷歌的I/O开发者大会2024&…

Qt开发 | Qt界面布局 | 水平布局 | 竖直布局 | 栅格布局 | 分裂器布局 | setLayout使用 | 添加右键菜单 | 布局切换与布局删除重构

文章目录 一、Qt界面布局二、Qt水平布局--QHBoxLayout三、Qt竖直布局四、Qt栅格布局五、分裂器布局代码实现六、setLayout使用说明七、布局切换与布局删除重构1.如何添加右键菜单2.布局切换与布局删除重构 一、Qt界面布局 Qt的界面布局类型可分为如下几种 水平布局&#xff08;…

【ai】tx2 nx :安装torch、torchvision for yolov5

torchvision 是自己本地构建的验证torchvision nvidia@tx2-nx:~/twork/03_yolov5/torchvision$ nvidia@tx2-nx:~/twork/03_yolov5/torchvision$ python3 Python 3.6.9 (default, Mar 10 2023, 16:46:00) [GCC 8.4.0] on linux Type "help", "copyright",…

乐鑫ESP32-WROOM-32E模组设备低功耗控制方案,启明云端乐鑫代理商

在数字化浪潮的推动下&#xff0c;物联网&#xff08;IoT&#xff09;正迅速成为我们日常生活的一部分。而在这个领域中&#xff0c;ESP32-WROOM-32E模组以其卓越的性能和多功能性&#xff0c;成为了开发者和制造商的选择。 ESP32-WROOM-32E模组集成了ESP32-D0WD-V3芯片&#…

迁移学习——CycleGAN——循环一致性对抗网络

CycleGAN 1.导入需要的包2.数据加载&#xff08;1&#xff09;to_img 函数&#xff08;2&#xff09;数据加载&#xff08;3&#xff09;图像转换 3.随机读取图像进行预处理&#xff08;1&#xff09;函数参数&#xff08;2&#xff09;数据路径&#xff08;3&#xff09;读取文…

NAS安全存储怎样实现更精细的数据权限管控?

NAS存储&#xff0c;即网络附属存储&#xff08;Network Attached Storage&#xff09;&#xff0c;是一种专用数据存储服务器&#xff0c;其核心特点在于将数据存储设备与网络相连&#xff0c;实现集中管理数据的功能。 NAS存储具有以下明显优势&#xff0c;而被全球范围内的企…