JavaScript 面向对象

news2025/1/18 4:49:01

一、对象

1.新建一个对象

// An object literal with two key-value pairs
let spaceship = {
  'Fuel Type': 'diesel',
  color: 'silver'
};

We separate each key-value pair in an object literal with a comma (,)

Keys are strings, but when we have a key that does not have any special characters in it, JavaScript allows us to omit the quotation marks

Keys are strings, but when we have a key that does not have any special characters in it, JavaScript allows us to omit the quotation marks

2.Accessing Properties 

我们可以用dot notation:

'hello'.length; // Returns 5

 也可以用这种方法:

let spaceship = {
  'Fuel Type': 'Turbo Fuel',
  'Active Duty': true,
  homePlanet: 'Earth',
  numCrew: 5
};
spaceship['Active Duty'];   // Returns true
spaceship['Fuel Type'];   // Returns  'Turbo Fuel'
spaceship['numCrew'];   // Returns 5
spaceship['!!!!!!!!!!!!!!!'];   // Returns undefined

当属性名中包含特殊字符的时候(比如空格),只能用这种方法 ,不能用dot notation。该有的引号不能少。

我们还可以编写一个函数来得到希望的属性的值:

let returnAnyProp = (objectName, propName) => objectName[propName];
 
returnAnyProp(spaceship, 'homePlanet'); // Returns 'Earth'

函数接受两个参数,分别代表希望得到属性的对象和希望得到的属性。

3.增删改属性

const spaceship = {type: 'shuttle'};
spaceship = {type: 'alien'}; // TypeError: Assignment to constant variable.
spaceship.type = 'alien'; // Changes the value of the type property
spaceship.speed = 'Mach 5'; // Creates a new key of 'speed' with a value of 'Mach 5'

4.给对象添加方法

可以用下面的两种语法来给对象写一个方法

const alienShip = {
  invade: function () { 
    console.log('Hello! We have come to dominate your planet. Instead of Earth, it shall be called New Xaculon.')
  }
};
const alienShip = {
  invade () { 
    console.log('Hello! We have come to dominate your planet. Instead of Earth, it shall be called New Xaculon.')
  }
};
alienShip.invade(); // Prints 'Hello! We have come to dominate your planet. Instead of Earth, it shall be called New Xaculon.'

当我们写多个方法时,不要忘记方法和方法之间的逗号:

let alienShip = {
  retreat() {
    console.log(retreatMessage)
  },
  takeOff() {
    console.log('Spim... Borp... Glix... Blastoff!')
  }
};

5.Nested Objects

const spaceship = {
     telescope: {
        yearBuilt: 2018,
        model: '91031-XLT',
        focalLength: 2032 
     },
    crew: {
        captain: { 
            name: 'Sandra', 
            degree: 'Computer Engineering', 
            encourageTeam() { console.log('We got this!') } 
         }
    },
    engine: {
        model: 'Nimbus2000'
     },
     nanoelectronics: {
         computer: {
            terabytes: 100,
            monitors: 'HD'
         },
        'back-up': {
           battery: 'Lithium',
           terabytes: 50
         }
    }
}; 

如果我们要访问属性:

spaceship.nanoelectronics['back-up'].battery; // Returns 'Lithium'

6.按引用传递

let spaceship = {
  homePlanet : 'Earth',
  color : 'red'
};
let tryReassignment = obj => {
  obj = {
    identified : false, 
    'transport type' : 'flying'
  }
  console.log(obj) // Prints {'identified': false, 'transport type': 'flying'}
 
};
tryReassignment(spaceship) // The attempt at reassignment does not work.
spaceship // Still returns {homePlanet : 'Earth', color : 'red'};
 
spaceship = {
  identified : false, 
  'transport type': 'flying'
}; // Regular reassignment still works.

`tryReassignment` 的函数接受一个对象作为参数。在 `tryReassignment` 函数中,尝试重新分配(reassignment)传入的对象 `obj`,将其设置为一个新的对象,改变原来的属性为新的属性: `{ identified: false, 'transport type': 'flying' }`。函数的参数为 `spaceship` 对象,因此尝试重新分配的是 `spaceship` 对象。

在这段代码中,`obj` 是一个函数参数,它是一个局部变量,只在函数中有效。当函数被调用时,`obj` 参数被赋值为传递给函数的实参 `spaceship` 的值,也就是 `spaceship` 对象的引用。因此,`obj` 和 `spaceship` 实际上引用了同一个对象。

在 `tryReassignment` 函数中,尝试重新分配 `obj`,将其设置为一个新的对象 `{ identified: false, 'transport type': 'flying' }`。这实际上是将 `obj` 的引用指向了一个新的对象,而不是修改了原始的 `spaceship` 对象。

因此,即使在 `tryReassignment` 函数中重新分配了 `obj`,原始的 `spaceship` 对象仍然保持不变。

因此,尽管在 `tryReassignment` 函数中重新分配了 `obj`,但原始的 `spaceship` 对象仍然保持不变。在函数调用后,`spaceship` 对象仍然是 `{ homePlanet: 'Earth', color: 'red' }`。

7.Looping Through Objects

js提供了for循环来直接遍历对象的属性。

let spaceship = {
    crew: {
    captain: { 
        name: 'Lily', 
        degree: 'Computer Engineering', 
        cheerTeam() { console.log('You got this!') } 
        },
    'chief officer': { 
        name: 'Dan', 
        degree: 'Aerospace Engineering', 
        agree() { console.log('I agree, captain!') } 
        },
    medic: { 
        name: 'Clementine', 
        degree: 'Physics', 
        announce() { console.log(`Jets on!`) } },
    translator: {
        name: 'Shauna', 
        degree: 'Conservation Science', 
        powerFuel() { console.log('The tank is full!') } 
        }
    }
}; 

// Write your code below

for (let crewMember in spaceship.crew) {
  console.log(`${crewMember}: ${spaceship.crew[crewMember].name}`)
};

for (let crewMember in spaceship.crew) {
  console.log(`${spaceship.crew[crewMember].name}: ${spaceship.crew[crewMember].degree}`)
};
captain: Lily
chief officer: Dan
medic: Clementine
translator: Shauna
Lily: Computer Engineering
Dan: Aerospace Engineering
Clementine: Physics
Shauna: Conservation Science

let实际上是对各个属性重命名,for循环会自动把各个属性的名字赋给let后的crewMember

如何通过这种方法准确找到希望的属性非常重要!

如果把第二个for循环改成:

for (let crewMember in spaceship.crew) {
  console.log(`${crewMember.name}: ${spaceship.crew[crewMember].degree}`)
};

undefined: Computer Engineering

undefined: Aerospace Engineering

undefined: Physics

undefined: Conservation Science 

原因是crewMember= captain,chief officer,而不是spaceship.crew[captain],spaceship.crew[chief officer],所以直接打印crewMember.name等于打印caption.name,可是最外层并没有caption这个对象,最外层只有spaceship对象,所以结果是undefined。

而第一个for循环里,我们只希望打印captain和chief officer,相当于打印两个字符串,而不是通过caption的地址打印其他内容,所以可以不需要加外层的索引(spaceship.crew[~~~~])

8.review

  • Objects store collections of key-value pairs.
  • Each key-value pair is a property—when a property is a function it is known as a method.
  • An object literal is composed of comma-separated key-value pairs surrounded by curly braces.
  • You can access, add or edit a property within an object by using dot notation or bracket notation.
  • We can add methods to our object literals using key-value syntax with anonymous function expressions as values or by using the new ES6 method syntax.
  • We can navigate complex, nested objects by chaining operators.
  • Objects are mutable—we can change their properties even when they’re declared with const.
  • Objects are passed by reference— when we make changes to an object passed into a function, those changes are permanent.
  • We can iterate through objects using the For...in syntax.

9.this

我们可以用this关键字来访问本对象的其他属性:

const robot = {
  model:'1E78V2',
  energyLevel:100,
  provideInfo(){
    return `I am ${this.model} and my current energy level is ${this.energyLevel}.`
  }
};

console.log(robot.provideInfo());
I am 1E78V2 and my current energy level is 100.

 注意:Arrow functions inherently bind, or tie, an already defined this value to the function itself that is NOT the calling object. In the code snippet above, the value of this is the global object, or an object that exists in the global scope, which doesn’t have a dietType property and therefore returns undefined.

const goat = {
  dietType: 'herbivore',
  makeSound() {
    console.log('baaa');
  },
  diet: () => {
    console.log(this.dietType);
  }
};
 
goat.diet(); // Prints undefined

10.Privacy

One common convention is to place an underscore _ before the name of a property to mean that the property should not be altered. Here’s an example of using _ to prepend a property.

const bankAccount = {
  _amount: 1000
}

In the example above, the _amount is not intended to be directly manipulated.

Even so, it is still possible to reassign _amount:

bankAccount._amount = 1000000;

所以有-并不是强制不给更改了,只是表明我不希望你更改。

11.get方法

const person = {
  _firstName: 'John',
  _lastName: 'Doe',
  get fullName() {
    if (this._firstName && this._lastName){
      return `${this._firstName} ${this._lastName}`;
    } else {
      return 'Missing a first name or a last name.';
    }
  }
}
 
// To call the getter method: 
person.fullName; // 'John Doe'

注意,get方法有自己的关键字get,当我们调用get方法的时候,我们不需要写括号,就好像我们在访问person的一个属性一样。

12.setter

const person = {
  _age: 37,
  set age(newAge){
    if (typeof newAge === 'number'){
      this._age = newAge;
    } else {
      console.log('You must assign a number to age');
    }
  }
};
person.age = 40;
console.log(person._age); // Logs: 40
person.age = '40'; // Logs: You must assign a number to age

setter也有自己的关键字,用setter赋值的时候,也不需要括号。

用getter和setter的一个好处是,可以对输入的类型做限定。

当然,我们也可以直接更改属性的内容,但是这样无法保证属性的类型:

person._age = 'forty-five'
console.log(person._age); // Prints forty-five

13.Factory Functions

我们可以用这种方式一次创建多个对象,有些像构造器

function robotFactory(model,mobile){
  return {
    model:model,
    mobile:mobile,
    beep(){
      console.log('Beep Boop');
    }
  }
}

const tinCan=robotFactory('P-500',true)
tinCan.beep();
Beep Boop

我们还可以做如下简化:

const robotFactory = (model, mobile) => {
  return {
     model,
     mobile,
    beep() {
      console.log('Beep Boop');
    }
  }
}

 14.Object.keys()

 The Object.keys() static method returns an array of a given object's own enumerable string-keyed property names.

const object1 = {
  a: 'somestring',
  b: 42,
  c: false
};

console.log(Object.keys(object1));
// Expected output: Array ["a", "b", "c"]

15.The Object.entries()

The Object.entries() static method returns an array of a given object's own enumerable string-keyed property key-value pairs.

const object1 = {
  a: 'somestring',
  b: 42
};

for (const [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

// Expected output:
// "a: somestring"
// "b: 42"

16.Object.assign() 

The Object.assign() static method copies all enumerable own properties from one or more source objects to a target object. It returns the modified target object.

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);
// Expected output: Object { a: 1, b: 4, c: 5 }

console.log(returnedTarget === target);
// Expected output: true

17.review

  • The object that a method belongs to is called the calling object.
  • The this keyword refers to the calling object and can be used to access properties of the calling object.
  • Methods do not automatically have access to other internal properties of the calling object.
  • The value of this depends on where the this is being accessed from.
  • We cannot use arrow functions as methods if we want to access other internal properties.
  • JavaScript objects do not have built-in privacy, rather there are conventions to follow to notify other developers about the intent of the code.
  • The usage of an underscore before a property name means that the original developer did not intend for that property to be directly changed.
  • Setters and getter methods allow for more detailed ways of accessing and assigning properties.
  • Factory functions allow us to create object instances quickly and repeatedly.
  • There are different ways to use object destructuring: one way is the property value shorthand and another is destructured assignment.
  • As with any concept, it is a good skill to learn how to use the documentation with objects!

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

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

相关文章

真人AI写真的制作方法-文生图换脸

AI写真最近火起来了,特别是某款现象级相机的出现,只需要上传自己的照片,就能生成漂亮的写真照,这一产品再次带火了AI绘画。今天我就来分享一个使用Stable Diffusion WebUI制作真人AI写真的方法,不用训练,快…

专家论道: 唐贤香云纱塑造中国非遗国际品牌

自“香云纱染整技艺”入选第二批国家级非物质文化遗产以来,被誉为纺织界“软黄金”的香云纱,重新焕发青春,频频登上时尚舞台,以不一样的面貌展示在世人面前,成为服装设计师、消费者青睐的材质。而随着北京卫视播出的《…

【JAVA】 javaSE中的数组|数组的概念使用

数组的概念 什么是Java中的数组 数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。在java中,包含6个整形类型元素的数组,可以看做是酒店中连续的6个房间. 1. 数组中存放的元素其类型相同 2. 数组的空间是连在一起的 3…

MySQL系统数据库及常用工具指令介绍

文章目录 1.系统数据库2.常用工具2.1 -e指令2.2 mysqladmin指令2.3 mysqlbinlog指令2.4 mysqlshow指令2.5 mysqldump指令 数据备份2.6 mysqlimport/source 指令 数据导入 3.指令小结 1.系统数据库 2.常用工具 2.1 -e指令 不用登陆mysql直接执行脚本命令 mysql -h192.168.200.…

一 关于idea如何在svn进行项目下载并运行成功

安装svn客户端 如图 安装时请选择该选项(Will be installed on local hard drive)并选择自己想要安装的目录路径 如图 svn安装成功 如图 注意 安装完成后,使用svn进行一次checkout的项目导出完成以上五步时&…

量化:numpy基础

文章目录 ndarray创建array创建顺序数组改变数据类型nan筛选元素去重重塑 ndarray numpy最重要的一个特点是其N维数组对象ndarry,它是一系列同类型数据的集合 创建array ndarry的创建方式如下: numpy.array(object, dtype None, copy True, order …

线上通过Nginx部署前端工程,并且配置SSL

介绍、为了更好的帮助大家学习,减少歧义,IP地址我就不隐藏了,公司也是我自己的公司。你们就别来攻击了。 下面给出步骤: 一、前期准备工作 通过在目标服务器上安装宝塔面板、安装redis、mysql、nginx、jdk环境等 1、 2、前端工程通过npm run build 打…

需要买apple pencil吗?平价的ipad手写笔推荐

自从ipad等平板电脑开始使用电容笔以来,电容笔已经成功地代替了我们的双手,使得我们的书写速度得到了极大的提高。但是,因为苹果原装的电容笔,因为具有独特的压感以及芯片技术,所以其的价格始终居高不下,这…

IntelliJ IDEA 2023.2社区版插件汇总

参考插件帝:https://gitee.com/zhengqingya/java-developer-document 突发小技巧:使用插件时要注意插件的版本兼容性,并根据自己的实际需求选择合适的插件。同时,不要过度依赖插件,保持简洁和高效的开发环境才是最重要…

APP开发中的性能优化:提升用户满意度的关键

APP开发中的性能优化是需要持续进行的,它不仅能够让用户体验到 APP的使用感受,还能在一定程度上提升用户的满意度,从而提升 APP的粘性和转化率。不过在实际开发中,很多 APP开发公司会存在性能优化上的问题,这就需要了解…

蓝网科技股份有限公司存在SQL注入

书把他从沉重的生活中拉出来,使他的精神不致被劳动压的麻木不仁。通过不断地读书,他认识到,只有一个人对世界了解得更广大,对人生看得更深刻,那么,他才可能对自己所处的艰难和困苦有更高意义的理解&#xf…

ChatGLM-6B大模型微调实战总结

作者简介:赵辉,区块链技术专家,精通各种联盟链、公链的底层原理,拥有丰富的区块链应用开发经验。 上篇我们已经具备了 ChatGLM-6B 初步的运行环境,这为实现完全属于自己的模型奠定了基础(快速部署ChatGLM-6…

LeetCode·每日一题·722. 删除注释·模拟

题目 示例 思路 题意 -> 给定一段代码,将代码中的注释删除并返回。 由于注释只有两种类型: 字符串// 表示行注释,表示//和其右侧的其余字符应该被忽略。字符串/* 表示一个块注释,它表示直到下一个(非重叠&#x…

怎么设置文件夹密码?文件夹密码设置方法合集

为文件夹设置密码可以有效地保护文件夹的数据安全,那么该怎么设置文件夹密码呢?下面我们来一起了解一下。 文件夹保护3000 想要简单快捷的为文件夹设置密码,那么,文件夹保护3000就是最佳的选择。它提供了3种文件夹保护方式&#…

基于SpringBoot+Vue的CSGO赛事管理系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

<!--富文本接收的位置--><view class"white-box"><view class"title"><view class"yellow-fence"></view><view class"v1">教研记录</view></view><view class"add-btn"…

C语言基础知识——结构体和共用体

1. 结构体 1.1 初识结构体 C语言的结构体是一种自定义的 数据类型&#xff0c;它允许你将不同类型的数据组合在一起&#xff0c;形成一个新的数据类型&#xff0c;以便更方便地管理和操作这些数据。结构体可以包含多个成员&#xff08;也称为字段或属性&#xff09;&#xff0…

使命、愿景、价值观到底有什么区别

以前的企业都是在发展到一定成熟阶段&#xff0c;才开始考虑这三个问题。但今天人们越来越多的意识到&#xff0c;哪怕在企业发展的初期&#xff0c;对于创业企业来说&#xff0c;确定公司的使命、愿景和核心价值观也是非常重要的。 明确的使命、愿景和核心价值观对于企业的好…

搭建k8s集群!!!

注意 k8s集群第一次搭建的话是麻烦且又繁琐的,大家不要着急,静下心来,一步一步搭建即可 linux网关及虚拟机下载不会弄的问题请详细看 linux的搭建及网关配置 这篇文章【也在此专栏】 环境规划 硬件环境 cpu 至少2核 内存 至少3G 硬盘 至少40G 软件环境 操作…

从录取成绩的角度来看,浙大MPA面试的客观公正性是有一定依据的

时间即将来到八月份&#xff01;不知道目前考生们今年的备考情况怎么样了&#xff0c;度过比较煎熬的三伏天&#xff0c;距离考研冲刺的时间越来越近&#xff01; 提前批面试申请对于不同的项目以及不同的考生意义都不一样。比如真正的学霸人物对于提面的申请与不申请一般差别不…