Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象

文章目录

  • 一、构造函数实例化对象
    • 1、基本语法
    • 2、构造函数与原型的关系
    • 3、完整的原型链
    • 4、构造函数的特点
    • 5、`prototype`与`__proto__`属性
      • 5.1、对象实例的`__proto__`属性
      • 5.2、`prototype`属性仅存在于函数对象
      • 5.3、实例与原型的关系
      • 5.4、获取对象原型
    • 6、注意事项

前言:

在 JavaScript 里,构造函数是创建对象实例的一种方式。构造函数本质上是普通的函数,不过有其特定的使用模式:要用 new 关键字来调用,这样才能创建对象实例。下面为详细介绍构造函数实例化对象的相关内容。

一、构造函数实例化对象

1、基本语法

使用构造函数创建对象实例,需要遵循以下步骤:

  • 定义一个构造函数,函数名一般首字母大写(这是约定俗成的写法,并非强制要求)。
  • 在构造函数内部,通过 this 关键字来设置对象的属性和方法。
  • 使用 new 关键字调用构造函数,从而创建对象实例。

下面是一个简单的例子:

// 定义一个构造函数
function Person(name, age) {this.name = name;this.age = age;this.sayHello = function() {console.log(`你好,我是${this.name},今年${this.age}岁了。`);};
}// 使用new关键字创建对象实例
const person1 = new Person('张三', 25);
const person2 = new Person('李四', 30);// 调用对象的属性和方法
console.log(person1.name); // 输出: 张三
person2.sayHello(); // 输出: 你好,我是李四,今年30岁了。

2、构造函数与原型的关系

当使用 new 关键字调用构造函数时,会按照以下步骤执行:

  • 首先创建一个新对象。
  • 让这个新对象的 [[Prototype]](即原型)指向构造函数的 prototype 属性。
  • 将构造函数的 this 绑定到新创建的对象上。
  • 执行构造函数内部的代码,这样就可以为新对象设置属性和方法。
  • 如果构造函数返回了一个对象,那么就返回该对象;否则,返回新创建的对象。

3、完整的原型链

一个典型的原型链如下所示:

实例对象 -> 构造函数.prototype -> Object.prototype -> null

验证方法:

persona1.__proto__ === Person.prototype; // true
Person.prototype.__proto__ === Object.prototype; // true
Object.prototype.__proto__ === null; // true

4、构造函数的特点

  • 属性和方法的复制:每次通过构造函数创建对象实例时,都会为每个实例复制一份属性和方法。就像上面例子中的 sayHello 方法,每个实例都有自己独立的副本。
  • 原型链继承:所有通过同一个构造函数创建的对象实例,都会继承构造函数 prototype 属性上的方法和属性。

下面通过代码说明原型链继承:

function Car(make, model) {this.make = make;this.model = model;
}// 给构造函数的prototype添加方法
Car.prototype.getInfo = function() {return `这是一辆${this.make} ${this.model}`;
};// 创建对象实例
const car1 = new Car('丰田', '卡罗拉');
const car2 = new Car('本田', '思域');// 调用原型上的方法
console.log(car1.getInfo()); // 输出: 这是一辆丰田 卡罗拉。
console.log(car2.getInfo()); // 输出: 这是一辆本田 思域。

5、prototype__proto__属性

5.1、对象实例的__proto__属性

在 JavaScript 中,对象实例本身没有prototype属性,但有__proto__属性(非标准,对应内部的[[Prototype]])。以下是详细说明:

  • __proto__(非标准):指向该对象的原型对象。
  • [[Prototype]](标准):内部属性,实际决定原型链。
const obj = {};
console.log(obj.prototype); // undefined(实例没有prototype属性)
console.log(obj.__proto__ === Object.prototype); // true

5.2、prototype属性仅存在于函数对象

每个函数默认有一个prototype属性,指向其原型对象:

function Person() {}
console.log(Person.prototype); // { constructor: ƒ Person() }// 验证函数也是对象,其原型是Function.prototype
console.log(Person.__proto__ === Function.prototype); // true

5.3、实例与原型的关系

当使用new创建对象时,实例的__proto__指向构造函数的prototype

function Person() {}
const alice = new Person();console.log(alice.__proto__ === Person.prototype); // true
console.log(Person.prototype.constructor === Person); // true

5.4、获取对象原型

推荐使用标准方法Object.getPrototypeOf()获取对象原型:

const obj = {};
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true

6、注意事项

  • 忘记使用 new 关键字的问题:如果在调用构造函数时忘记使用 new 关键字,this 会指向全局对象(在浏览器环境中是 window 对象),这可能会导致意外的结果。为了避免这种情况,可以使用箭头函数或者在构造函数内部检查 this 是否是当前构造函数的实例。
  • 性能方面的考虑:如果构造函数内部定义了大量方法,每个对象实例都会拥有这些方法的独立副本,这会造成内存的浪费。通常的做法是将共享的方法定义在构造函数的 prototype 上。

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

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

相关文章

自动驾驶科普(百度Apollo)学习笔记

1. 写在前面 在过去的几年里,自动驾驶技术取得飞速发展,人类社会正逐渐走向一个新时代,这个时代中,汽车不仅仅是一个交通工具,更是一个智能的、能够感知环境、做出决策并自主导航的机器伙伴。现在正好也从事这块的工作…

Windows应用-音视频捕获

下载“Windows应用-音视频捕获”项目 本应用可以同时捕获4个视频源和4个音频源,可以监视视频源图像,监听音频源;可以将视频源图像写入MP4文件,将音频源写入MP3或WAV文件;还可以录制系统播放的声音。本应用使用MFC对话框…

MATLAB生成大规模无线通信网络拓扑(任意节点数量)

功能: 生成任意节点数量的网络拓扑,符合现实世界节点空间分布和连接规律 效果: 30节点: 100节点: 500节点: 程序: %创建时间:2025年6月8日 %zhouzhichao %自然生长出n节点的网络% …

TDengine 开发指南—— UDF函数

UDF 简介 在某些应用场景中,应用逻辑需要的查询功能无法直接使用内置函数来实现,TDengine 允许编写用户自定义函数(UDF),以便解决特殊应用场景中的使用需求。UDF 在集群中注册成功后,可以像系统内置函数一…

C#提取CAN ASC文件时间戳:实现与性能优化

C#提取CAN ASC文件时间戳:实现与性能优化 在汽车电子和工业控制领域,CAN总线是最常用的通信协议之一。而ASC(ASCII)文件作为CAN总线数据的标准日志格式,广泛应用于数据记录和分析场景。本文将深入探讨如何高效地从CAN…

计算机网络基础总结:TCP/IP 模型、TCP vs UDP、DNS 查询过程

在学习计算机网络的过程中,理解 TCP/IP 模型与 OSI 模型的对应关系、掌握 TCP 与 UDP 的区别,以及熟悉 DNS 的查询过程,是打好网络基础的关键。本文将围绕这三部分进行简明扼要的讲解。 一、TCP/IP 模型与 OSI 七层模型的对应关系 1. OSI 七…

基于PHP的扎染文创产品商城

有需要请加文章底部Q哦 可远程调试 基于PHP的扎染文创产品商城 一 介绍 扎染文创产品商城系统基于原生PHP开发,数据库mysql,前端bootstrap,jquery.js等。系统角色分为用户和管理员。 技术栈:phpmysqlbootstrapphpstudyvscode 二…

数据库学习(三)——MySQL锁

一、MySQL锁 当多个用户或进程并发操作数据库时,为了避免数据冲突、脏读、不可重复读、幻读等问题,数据库通过锁机制来保证数据的一致性和完整性。 MySQL 锁的总体分类: 分类维度类型说明按作用对象表级锁(Table Lock&#xff…

<3>-MySQL表的操作

目录 一,创建表 二,查看表结构 三,修改表 四,删除表 一,创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 eng…

【OSG学习笔记】Day 15: 路径动画与相机漫游

本章来学习下漫游相机。 路径动画与相机漫游 本届内容比较简单,其实就是实现物体的运动和相机的运动 当然这两个要一起执行。 贝塞尔曲线 贝塞尔曲线(Bzier curve)是一种在计算机图形学、动画制作、工业设计等领域广泛应用的参数曲线&am…

LabVIEW自感现象远程实验平台

LabVIEW开发自感现象远程实验平台,通过整合 NI数据采集设备、菲尼克斯(Phoenix Contact)继电器模块及罗技(Logitech)高清摄像头,实现远程数据采集、仪器控制与实时监控三大核心功能。平台突破传统实验装置局…

数据结构——F/图

一、图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 顶点集合V {x|x属于某个数据对象集}是有穷非空集合&#xff1b; E {(x,y)|x,y属于V}或者E {<x, y>|x,y属于V && Path(x, y)…

springcloud openfeign 偶现 Caused by: java.net.UnknownHostException

背景 最近查看日志发现某服务偶现Caused by: java.net.UnknownHostException 同时查看eureka的access.log 出现如下异常 10.xxx.xxx.xxx - - [27/May/2025:23:57:29 0800] “PUT /eureka/apps/{appName}/{host}:xxx-job:8082?statusUP&lastDirtyTimestamp1748351637173 H…

第12篇:数据库中间件日志设计与追踪系统落地实践

12.1 引言&#xff1a;中间件日志系统为何如此关键&#xff1f; 数据库中间件作为连接前端应用与后端数据库的“网关”&#xff0c;承载着路由、负载均衡、SQL 改写、权限控制等复杂逻辑。 在出现 性能问题、故障排查、安全审计 等场景中&#xff0c;若没有完善的日志体系&am…

OpenAI对抗法庭命令:捍卫ChatGPT用户隐私之战

人工智能公司OpenAI近期正积极对抗一项涉及隐私问题的法庭命令。该命令要求OpenAI保留所有ChatGPT用户日志&#xff0c;包括已删除的对话记录以及通过API调用生成的聊天内容。 命令背后的真实动机 值得注意的是&#xff0c;法院发布这一指令并非出于对用户隐私或内容安全的考…

嵌入式学习--江协stm32day5

USART 1. 引脚与接口层 异步引脚&#xff1a; TX&#xff1a;发送数据输出&#xff1b;RX&#xff1a;接收数据输入&#xff1b;SW_RX&#xff1a;单线半双工模式的接收引脚&#xff08;替代 RX&#xff09;。 同步引脚&#xff1a;SCLK&#xff1a;同步模式下的时钟输出&…

使用Fiddler抓包

有时候需要跟踪一些小程序的HTTP请求&#xff0c;但是无法像浏览器一样F12查看请求&#xff0c;因此需要借助其他的工具进行&#xff0c;在这里推荐使用Fiddler 配置 此时检查系统代理已经变成如下配置&#xff1a; 抓包 此时随便打开一个小程序&#xff0c;就可以进行抓包…

python学习打卡day47

DAY 47 注意力热图可视化 昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 # 可视化空间注意力热力图&#xff08;显示模型关注的图像区域&#xff09; def visualize_attention_map(model, test_loader,…

MySQL-运维篇

运维篇 日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&am…

Prompt Tuning(提示调优)到底训练优化的什么部位

Prompt Tuning(提示调优)到底训练优化的什么部位 在自然语言处理(NLP)领域,Prompt Tuning(提示调优)是一种轻量级的模型优化技术,其核心目标是通过优化提示(Prompt)来引导预训练语言模型(如GPT、BERT等)更好地完成特定任务,而无需大规模调整模型的主体参数。 一…