JS(七)avaScript中的对象

JS(七)avaScript中的对象

01 什么是对象

  • 在JavaScript中,对象是一种复合数据类型,用于存储键值对。对象可以包含多个属性(键值对),每个属性都有一个名称(键)和一个值。

  • 这些值可以是基本数据类型(如字符串、数字、布尔值)、其他对象,或者函数。

  • 对象是 JavaScript 中最重要的数据类型之一,几乎所有的东西都是对象,包括数组、函数、日期,甚至是原始数据类型的包装对象(例如字符串、数字和布尔值)。

  • 对象提供了一种灵活的方式来组织和管理数据,使得开发者能够以更加直观和结构化的方式处理复杂的数据结构。

JavaScript 对象具有以下特点:

  1. 属性和方法:对象由属性和方法组成,属性是键值对中的键,方法是键值对中的函数值。
  2. 动态性:对象的属性和方法可以随时添加、修改或删除。
  3. 无序性:对象的属性没有固定的顺序。
  4. 引用类型:对象是引用类型的实例,可以通过引用来传递和操作。
  5. 原型继承:JavaScript 中的对象可以通过原型链来继承属性和方法。

以下是一个简单的 JavaScript 对象示例:

// 创建一个空对象
var person = {};// 添加属性
person.name = "John";
person.age = 30;
person.gender = "male";// 添加方法
person.sayHello = function() {console.log("Hello, my name is " + this.name + " and I'm " + this.age + " years old.");
};// 调用方法
person.sayHello(); // 输出: Hello, my name is John and I'm 30 years old.

02 为什么使用对象

  • 组织数据:对象提供了一种组织和存储数据的方式,可以将相关的数据属性组合在一起,形成一个逻辑上的单元。
  • 抽象复杂性:对象允许将复杂的数据结构抽象为一个单一的实体,使得代码更易于理解和维护。
  • 封装:对象可以封装属性和方法,通过公开接口暴露特定的功能,隐藏实现细节,从而提高代码的模块化和可重用性。
  • 可扩展性:对象的属性和方法可以随时添加、修改或删除,使得代码更具灵活性和可扩展性。
  • 代码重用:通过创建对象模板(例如构造函数或类),可以实现代码的重用,多个对象可以共享相同的属性和方法。
  • 传递和返回复杂值:对象可以作为参数传递给函数,也可以作为函数的返回值,从而实现对复杂值的传递和返回。
  • 面向对象编程:JavaScript 是一种面向对象的语言,对象是面向对象编程的基本单位,使用对象可以更轻松地实现面向对象编程的思想和模式。
  • JSON 数据交换:JavaScript 对象符合 JSON(JavaScript Object Notation)格式,因此在 Web 开发中经常用于数据交换和通信。

03 创建对象

1.对象字面量

  • 使用对象字面量的方式可以直接创建一个对象,并指定其属性和方法。
var person = {name: "John",age: 30,sayHello: function() {console.log("Hello, my name is " + this.name + " and I'm " + this.age + " years old.");}
};
console.log(person)// 输出: {name: 'John', age: 30, sayHello: ƒ}

2.使用构造函数

  • 使用构造函数可以创建一个对象模板,并通过new关键字实例化对象。
function Person(name, age) {this.name = name;this.age = age;this.sayHello = function() {console.log("Hello, my name is " + this.name + " and I'm " + this.age + " years old.");};
}var person1 = new Person("John", 30);// 输出: Person {name: 'John', age: 30, sayHello: ƒ}
var person2 = new Person("Alice", 25);// 输出: Person {name: 'Alice', age: 25, sayHello: ƒ}console.log(person1);
console.log(person2);

3.使用Object.create()方法

  • 使用Object.create()方法可以创建一个新对象,并指定其原型对象。
var personProto = {sayHello: function() {console.log("Hello, my name is " + this.name + " and I'm " + this.age + " years old.");}
};var person = Object.create(personProto);
person.name = "John";
person.age = 30;
person.sayHello()// 输出: Hello, my name is John and I'm 30 years old.
console.log(person);// 输出: {name: 'John', age: 30}

4.使用类(ES6及以后版本)

  • 使用类的方式可以更方便地定义对象模板,并创建对象实例。
class Person {constructor(name, age) {this.name = name;this.age = age;}sayHello() {console.log("Hello, my name is " + this.name + " and I'm " + this.age + " years old.");}
}var person = new Person("John", 30);
person.sayHello()// 输出: Hello, my name is John and I'm 30 years old.
console.log(person);// 输出: {name: 'John', age: 30}

04 访问属性/方法

1.点符号 (.) 访问

  • 使用点符号可以直接访问对象的属性和方法,语法为:对象名.属性名对象名.方法名()
var person = {name: "John",age: 30,sayHello: function() {console.log("Hello, my name is " + this.name + " and I'm " + this.age + " years old.");}
};console.log(person.name); // 输出: John
person.sayHello(); // 输出: Hello, my name is John and I'm 30 years old.

2.方括号 ([]) 访问

  • 使用方括号可以动态地访问对象的属性和方法,语法为:对象名["属性名"]对象名["方法名"]()
var person = {name: "John",age: 30,sayHello: function() {console.log("Hello, my name is " + this.name + " and I'm " + this.age + " years old.");}
};console.log(person.name); // 输出: John
person.sayHello(); // 输出: Hello, my name is John and I'm 30 years old.var propertyName = "name";
console.log(person[propertyName]); // 输出: Johnvar methodName = "sayHello";
person[methodName](); // 输出: Hello, my name is John and I'm 30 years old.console.log(person);// 输出: name: 'John', age: 30, sayHello: ƒ}

注意:

  • 通常情况下,使用点符号更为常见和直观,但是方括号语法可以使用变量来动态访问对象的属性和方法,这在某些情况下非常有用。

  • 如果属性或方法名中包含特殊字符或者以数字开头,就必须使用方括号访问,例如:对象名["my-property"]对象名["123method"]()

05 修改属性

1.直接赋值

  • 可以直接使用赋值操作符(=)来修改对象的属性值。
javascriptCopy Codevar person = {name: "John",age: 30
};// 修改属性值
person.name = "Alice";
person.age = 25;console.log(person.name); // 输出: Alice
console.log(person.age); // 输出: 25

2.使用对象的方法

  • 有时候,对象可能会提供一些方法来修改属性值,例如 set 方法。
var person = {_name: "John",_age: 30,setName: function(newName) {this._name = newName;},setAge: function(newAge) {this._age = newAge;}
};// 使用对象的方法修改属性值
person.setName("Alice");
person.setAge(25);console.log(person._name); // 输出: Alice
console.log(person._age); // 输出: 25

06 遍历对象

1.for…in 循环

  • 使用 for...in 循环可以遍历对象的可枚举属性(包括自身属性和继承属性)。
var person = {name: "John",age: 30,gender: "male"
};for (var key in person) {console.log(key + ": " + person[key]);
}
//  输出:name: John
//  age: 30
//  gender: male
  • 在使用 for...in 循环时,可能会遍历到对象继承的属性,因此需要使用 hasOwnProperty() 方法来判断属性是否为对象自身的属性。

2.Object.keys() 方法

  • 使用 Object.keys() 方法可以获取对象自身可枚举属性组成的数组,然后可以对数组进行遍历操作。
var person = {name: "John",age: 30,gender: "male"
};Object.keys(person).forEach(function(key) {console.log(key + ": " + person[key]);
});
//  输出:name: John
//  age: 30
//  gender: male

3.Object.getOwnPropertyNames() 方法

  • 使用 Object.getOwnPropertyNames() 方法可以获取对象自身所有属性(包括不可枚举属性),然后可以对数组进行遍历操作。
var person = {name: "John",age: 30,gender: "male"
};Object.getOwnPropertyNames(person).forEach(function(key) {console.log(key + ": " + person[key]);
});
//  输出:name: John
//  age: 30
//  gender: male

4.方法2与方法3的区别

1.Object.getOwnPropertyNames() 方法:
  • 获取对象自身所有属性(包括不可枚举属性),以数组形式返回。
  • 返回的数组包含对象自身的所有属性,不仅仅是可枚举的属性。
  • 不会获取继承的属性,只返回对象自身的属性。
  • 可以用于获取对象的所有属性,包括不可枚举的属性。
var obj = {a: 1,b: 2
};Object.defineProperty(obj, 'c', {value: 3,enumerable: false // 设置属性 c 为不可枚举
});console.log(Object.getOwnPropertyNames(obj)); // 输出: ["a", "b", "c"]
2.Object.keys() 方法:
  • 获取对象自身可枚举属性的键名,以数组形式返回。
  • 只返回对象自身的可枚举属性,不包括不可枚举的属性和继承的属性。
  • 通常用于获取对象的可枚举属性,比较适合用于遍历对象的键值对。
var obj = {a: 1,b: 2
};Object.defineProperty(obj, 'c', {value: 3,enumerable: false // 设置属性 c 为不可枚举
});console.log(Object.keys(obj)); // 输出: ["a", "b"]
3.使用场景
  • 如果需要获取对象的所有属性,包括不可枚举属性,可以使用 Object.getOwnPropertyNames() 方法。
  • 如果只需要获取对象的可枚举属性,一般可以使用 Object.keys() 方法,这在进行对象属性的遍历或者筛选时很方便。

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

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

相关文章

五年经验,连个文件下载方法都写不好

前言 在java web开发中,我们经常遇到浏览器文件下载的功能,看似很简单的功能,有些几年经验的老鸟,都写不好,大家遇到这种功能,都是直接CtrlC一下代码,具体代码估计都没看。下面有两种写法对比&…

php获取文件列表(所有子目录文件)

方法一&#xff1a; 可以使用递归函数来获取所有子目录下的文件列表&#xff0c;以下是一个示例代码&#xff1a; <?php function getFiles($dir) {$files [];if (is_dir($dir)) {$handle opendir($dir);while (($file readdir($handle)) ! false) {if ($file ! . &…

2025中国跨境电商交易会(春季福州)

2025中国跨境电商交易会&#xff08;春季福州&#xff09; 时间&#xff1a;2025年3月18-20日 地点&#xff1a;福州海峡国际会展中心 预订以上展会详询陆先生 I38&#xff08;前三位&#xff09; I82I&#xff08;中间四位&#xff09; 9I72&#xff08;后面四位&#x…

10.windows ubuntu 组装软件:spades,megahit

Spades 是一种用于组装测序数据的软件&#xff0c;特别适用于处理 Illumina 测序平台产生的数据。它的全称是 "St. Petersburg genome assembler"&#xff0c;是一款广泛使用的基因组组装工具。 第一种&#xff1a;wget https://cab.spbu.ru/files/release3.15.3/S…

系统慢查询的思考

系统慢查询的思考 在一个系统中发现慢查询的功能或很卡的现象。你是怎么思考的&#xff1f;从哪几个方面去思考&#xff1f;会用什么工具&#xff1f; 一个系统使用了几年后都可能会出现这样的问题。原因可能有以下几点。 数据量的增加。系统中平时的使用中数据量是有一个累…

数据结构——优先级队列及多服务台模拟系统的实现

一、优先级队列的定义和存储 优先级队列定义&#xff1a;优先级高的元素在队头&#xff0c;优先级低的元素在队尾 基于普通线性表实现优先级队列&#xff0c;入队和出队中必有一个时间复杂度O(n),基于二叉树结构实现优先级队列&#xff0c;能够让入队和出队时间复杂度都为O(log…

正多边形拓扑与泛函

&#xff08;原创&#xff1a;Daode3056&#xff09; 也许&#xff0c;关于“拓扑”&#xff0c;“泛函”几本书上的内容与实例都是大同小异&#xff0c;总是那么点内容&#xff0c;数学要开拓一些新领域与新内容才能满足不断发展的社会与工业各种需要。本文就以人工智能生成对…

喜报!湖南创远荣获“2023年度中国有色金属工业科技进步奖”二等奖

近日&#xff0c;一则喜讯传来&#xff0c;湖南创远再创佳绩&#xff0c;联合中南大学、山西紫金合作的“智能矿山穿孔装备智能作业系统”项目荣获“中国有色金属工业科学技术奖二等奖”。 穿孔作业是传统非煤矿山开采的关键环节&#xff0c;穿孔效率、穿孔质量&#xff0c;直接…

nextjs+shadcn学习

1、安装nextjs 创建文件夹next-shadcn 在文件夹中执行 npx create-next-applatest . --typescript --tailwind --eslint安装后&#xff0c;跑起来 2、安装shadcn 在刚才目录下&#xff0c;运行命令 npx shadcn-uilatest init目录中会增加两个目录 components 和lib 替换原…

MySQL数据库 - 表基本操作

一、修改表名 本关任务&#xff1a;修改表名&#xff0c;并查询修改后表的结构。 查看所有表 show tables; 查看表基本结构 DESCRIBE 表名&#xff1b; 或 简写为 desc 表名; 查看创建表的语句 SHOW CREATE TABLE 使用 SHOW CREATE TABLE 语句&#xff0c;不仅仅可以返…

vue 怎么处理get请求,接收url地址栏参数

一般来说&#xff0c;vue直接处理url参数请求的几率比较小&#xff0c;但是有时动态路由会用得到。 在vue2中较为简单&#xff0c;直接用this.$route.query.参数名称&#xff0c;即可获取。如下&#xff1a; <template><div>{{userid }}</div> </templa…

MySql实战--行锁功过:怎么减少行锁对性能的影响

在上一篇文章中&#xff0c;我跟你介绍了MySQL的全局锁和表级锁&#xff0c;今天我们就来讲讲MySQL的行锁。 MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁&#xff0c;比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁&#xf…

通天星CMSV6 车载定位监控平台 任意文件上传漏洞复现(XVE-2023-23454)

0x01 产品简介 通天星CMSV6车载定位监控平台拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。 0x02 漏洞概述 …

【Chiplet】技术总结

Chiplet基本知识点汇总 1. Wafer, die, chip, cell的区分2. MCM, SiP, SoC, Chiplet的区别4. Chiplets的先进封装5. Chiplet发展阶段 Chiplet基本知识点汇总 1. Wafer, die, chip, cell的区分 Wafer: 晶圆&#xff0c;指一整个晶圆硅片。 Die: 从晶圆上切分下来的小方格&a…

PHP中常见的CRUD函数

PHP中常见的CRUD函数 创建&#xff08;Create&#xff09;&#xff1a;创建一个新的数据记录 function create($name, $age, $email) {$conn mysqli_connect("localhost", "username", "password", "myDB");$sql "INSERT INT…

Vue3+.NET6前后端分离式管理后台实战(十)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战&#xff08;十&#xff09;已经在订阅号发布有兴趣的可以关注一下&#xff01; 感兴趣请关注订阅号谢谢&#xff01; 代码已经上传gitee

C++--内联函数

当调用一个函数时&#xff0c;程序就会跳转到该函数&#xff0c;函数执行完毕后&#xff0c;程序又返回到原来调用该函数的位置的下一句。 函数的调用也需要花时间&#xff0c;C中对于功能简单、规模小、使用频繁的函数&#xff0c;可以将其设置为内联函数。 内联函数&#xff…

【SQL】1667. 修复表中的名字(UPPER()、LOWER()、SUBSTRING()、CONCAT())

前述 SQL中字符串截取函数(SUBSTRING) SQL 字母大小写转换函数UPPER()、UCASE()、LOWER()和LCASE() 题目描述 leetcode题目&#xff1a;1667. 修复表中的名字 Code select user_id, concat(upper(substring(name, 1, 1)),lower(substring(name, 2)) ) as name from Users o…

基于springboot+vue+Mysql的篮球论坛系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

adc123456

DMA主要用于协助CPU完成数据转运的工作 DMA&#xff0c;英文全称Direct Memory Access&#xff0c;DMA这个外设是可以直接访问STM32内部存储器的&#xff0c;包括运行内存SRAM&#xff0c;程序存储器flash和寄存器等等&#xff0c;DMA都有权限访问&#xff0c;所以DMA能完成数据…