(day 14)JavaScript学习笔记(对象2)

概述

        这是我的学习笔记,记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript,那么这一系列的学习笔记可能会对你有所帮助。

        今天继续学习对象,主要是this、getters和setters、原型(prototype)等。

目录

1.this

2.getters和setters

3.原型(prototype)


1.this

        当函数作为对象的方法被调用时,this 通常指向该对象。如下代码:

//当函数作为对象的方法被调用时,this 通常指向该对象。
var stu1 = {name: "小鹏",id: 20240001,attendClas() {console.log(this.name + "上课"); //此处的this指向的是stu1这个对象},
};
stu1.attendClas(); //输出:小鹏上课

        如果我们给对象添加方法时,用普通函数,this指向的是该对象,例如给stu1增加eat方法,可以用如下代码:        

stu1.eat = function () {console.log(this.name + "吃饭");
};
stu1.eat();// //输出:小鹏吃饭

        但是如果用箭头函数,this的指向是不同的,如下代码:

stu1.sleep = () => {console.log(this.name + "睡觉");//访问不到对象stu1的name属性,输出:睡觉console.log(this);// [object Window]
};
stu1.sleep();

         上面代码中this指向的是window,window是浏览器内置的对象,原因是箭头函数的this指向的是包裹它的作用域的this对象,由于我们上面的箭头函数中没有包裹它的作用域,所有this指向的是全局的对象,也就是window对象,如果把箭头函数定义在构造函数中,那它就是构造函数里的this,也就是新创建的对象实例自身,如下代码演示:        

function Student(name, id) {this.name = name;this.id = id;this.sayHello = () => {console.log("你好,我是" + this.name + ",很高兴认识你。");//这里的this指向的是包裹它的作用域的this,而包裹它的作用域的this指向的是对象本身};
}//创建实例
var stu2 = new Student("小鹏", "202400007");
stu2.sayHello(); //输出:你好,我是小鹏,很高兴认识你。

         注意:一般箭头函数不做为对象的方法使用,对象的方法一般使用普通函数。

2.getters和setters

        getters 和 setters 是特殊的函数,它们允许你创建对象属性的访问器方法。getter 是一种特殊的方法,用于获取属性值;setter 则是一种特殊的方法,用于设置属性值。它们提供了一种更灵活和强大的方式来控制对对象属性的访问和修改。如下代码示例:

//用字面值创建一个person
var person = {firstName: "鹏",lastName: "王",//定义getters,用get关键字get fullName() {return this.lastName + this.firstName;},//定义setters,用set关键字,只能接收一个参数set fullName(fullName) {let [lastName, firstName] = fullName.split(",");this.firstName = firstName;this.lastName = lastName;},
};console.log(person.fullName); //输出:王鹏
person.fullName = "王,小鹏"; //设置名字
console.log(person.fullName); //输出:王小鹏
console.log(person.firstName, person.lastName); //输出:小鹏 王

         上面是用字面值创建的对象,如果是用构造函数创建的对象,后面也可以增加 getters 和 setters,需要用到Object.defineProperty方法,它的语法结构是这样的:

Object.defineProperty(对象实例名,要增加的属性名,{

        get:function(){

                getters的代码

                },

        set:function(接收一个参数名){

                setters的代码

                }

})

        具体可看如下代码是示例:

//定义构造函数
function Student2(name, id) {this.name = name;this.id = id;
}//创建stu13实例对象
var stu13 = new Student("小红", 20240010);
//添加getters和setters
Object.defineProperty(stu13, "info", {get: function () {return this.name + "学号" + this.id;},set: function (info) {let [name, id] = info.split(" ");this.name = name;this.id = id;},
});console.log(stu13.info); //info是属性,不是方法,所以不加括号。输出:小红学号20240010
stu13.info = "小白 20240020"; //修改属性
console.log(stu13.info); //输出:小白学号20240020
console.log(stu13.name); //输出:小白
console.log(stu13.id); //输出:20240020

3.原型(prototype)

        在JavaScript中,原型(prototype)是一个非常重要的概念,它允许我们创建可重用的对象类型及其方法。理解原型是理解JavaScript对象模型的关键部分,也是掌握JavaScript面向对象编程的基础。

        在JavaScript中,构造函数通常用于创建特定类型的对象。每个构造函数都有一个prototype属性,这个属性是一个对象,用于包含所有实例共享的方法和属性。当我们使用new操作符创建一个构造函数的实例时,这个实例的内部会包含一个链接指向构造函数的prototype对象。

        如下代码示例:

//先创建一个构造函数
function Student3(name, id) {this.name = name;this.id = id;this.eat = function () {console.log(this.name + "吃饭");};
}
//创建两个实例stu14和stu15
var stu14 = new Student3("小雪", 20240014);
var stu15 = new Student3("小雨", 20240015);console.log(stu14); //输出:Student3 {name: '小雪', id: 20240014, eat: ƒ}
console.log(stu15); //输出:Student3 {name: '小雨', id: 20240015, eat: ƒ}

        上面代码运行后我们在浏览器中看到的内容是这样的:

        左侧的小三角可以点开,点开后如下截图所示,我们能看到有个[[Prototype]],这个就是原型,如下截图:

        再继续点开能够看到如下截图,constructor这里就是我们的构造函数的原型

        我们可以给构造函数原型增加属性,它的实例都会继承这些属性,如下代码所示:

Student3.prototype.age = 18; //给构造函数Student3的原型增加age属性并赋值
console.log(stu14.age); //stu14继承了构造函数Student3原型的属性,所以能访问到,输出:18
console.log(stu15.age); //stu15继承了构造函数Student3原型的属性,所以能访问到,输出:18

        我们还可以给构造函数增加方法,如下代码所示:

//给构造函数原型增加方法
Student3.prototype.showInfor = function () {console.log(this.name + " 学号:" + this.id + ",年龄:" + this.age);
};stu14.showInfor(); //输出:小雪 学号:20240014,年龄:18
stu15.showInfor(); //输出:小雨 学号:20240015,年龄:18

        查看对象的原型用:对象.__proto__ 对象的原型继承自构造的函数的原型,所以他们两个的原型是一样的,如下代码所示:

console.log(stu14.__proto__); // 查看对象的原型
console.log(Student3.prototype); //查看构造函数Student3的原型

        运行结果可以看下对象的原型和构造函数的原型是一样的:

        我们还可以判断二者是否相等,如下代码所示:

console.log(stu14.__proto__ === Student3.prototype); //输出:true

         返回的是 true,并且 我们用的是三个等号,说明他们绝对相等的。

        我们还可以用Object.getprototypeof来获取对象的prototype,如下代码:

console.log(Object.getPrototypeOf(stu15));

        以上便是今天学习的内容,如果对你有所帮助,请点个赞再走吧。

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

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

相关文章

vulhub中DNS域传送漏洞复现

DNS协议支持使用axfr类型的记录进行区域传送,用来解决主从同步的问题。如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源,将会导致DNS域传送漏洞。 环境搭建 Vulhub使用Bind9来搭建dns服务器,但不代表只有Bind9支持AXFR记录。运行…

Power BI学习(数据可视化)

另一个也可以的工具是:Tableau 还有一个是:神策,主要是用于互联网的app的数据埋点 数据分析的过程: 数据源--数据清洗(power query)-构建指标 新建度量值(power pivot)-可视化&…

构建一个前端智能停车可视化系统

引言 随着城市化进程的加速,停车难问题日益突出。智能停车可视化系统通过实时展示停车场的车位信息,帮助用户快速找到空闲车位,提高停车效率。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 2. 安装依赖 3. 创建停车场组件 4. 集…

MAC IntelliJ IDEA搭建Doris Fe

目录 版本信息 安装环境依赖 拉取源码 下载 Doris 编译依赖 修改系统最大文件句柄数 编译 Doris 配置 Debug 环境 生成 FE 代码 FE模块代码导入 配置 Debug FE 启动 FE 报错问题 版本信息 本次安装的doris版本信息为doris-2.1.0-rc11 IntelliJ IDEA 配置jdk17、m…

数据之王国:解析Facebook的大数据应用

引言 作为全球最大的社交媒体平台之一,Facebook拥有庞大的用户群体和海量的数据资源。这些数据不仅包括用户的个人信息和社交行为,还涵盖了广告点击、浏览记录等多方面内容。Facebook通过巧妙地利用这些数据,构建了强大的大数据应用系统&…

Web框架开发-Django模型层(数据库操作)

一、ORM介绍 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动ORM是“对象-关系-映…

拌合楼管理系统(八) c#海康威视摄像头车牌识别

前言: c#调用海康威视SDK实现车牌识别 原本以为海康威视sdk的Demo里面没有车牌识别的实例,后来发现自己肤浅了,官方是有提供的,只是车牌识别是通过安防布警的方式实现的.程序主动监听,触发告警后获取到车牌信息. 一、接口调用的流程: 首先初始化sdk -> 开…

SQLiteC/C++接口详细介绍sqlite3_stmt类(四)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(三) 下一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(五) 7. sqlite3_bind_parameter_count函数 sqlite3_bind_param…

流畅的 Python 第二版(GPT 重译)(十一)

第二十章:并发执行器 抨击线程的人通常是系统程序员,他们心中有着典型应用程序员终其一生都不会遇到的用例。[…] 在 99%的用例中,应用程序员可能会遇到的情况是,生成一堆独立线程并将结果收集到队列中的简单模式就是他们需要了解…

Java newInstance方法学习

用newInstance与用new是有区别的,区别在于创建对象的方式不一样,前者是使用类加载机制; newInstance方法要求该 Class 对应类有无参构造方法; 执行 newInstance()方法实际上就是使用对应类的无参构造方法来创建该类的实例&#x…

YOLOV4-车道线检测-车距离预测

1.前言 最近在看华为的CANN框架,发现了一些很有意思的开源算法(本文所有的代码都出自华为开源git发布的代码),华为最近出了AI PRO开发板,想着现在开发板上用用(不想重新配置环境了,麻烦还累),看着代码有onnx的模型&…

绝地求生:PUBG延长GPU崩溃时间新方法

相信大家都在被GPU游戏崩溃苦恼已久,PUBG这个游戏崩溃,跟超频是没有多大关系的,只要超频TM5过测,YC过测,或者双烤过测,就没问题。主要是这个游戏的优化不行,特别40系显卡,对内存条也…

免费AI出图神器:StableStudio——定义AI作画新前景

StableStudio:探索艺术与科技的无限交界,StableStudio引领AI智能创作新浪潮! - 精选真开源,释放新价值。 概览 ChatGPT大语言模型AI的诞生引爆了对AIGC的讨论。AIGC 又称生成式 AI (Generative AI),是继专业生产内容&…

Python 全栈体系【四阶】(十七)

第五章 深度学习 一、基本理论 3. 深度神经网络训练法则 3.1 损失函数 3.1.1 什么是损失函数? 损失函数(Loss Function),也有称之为代价函数(Cost Function),用来度量预测值和实际值之间的差…

html5cssjs代码 029 CSS计数器

html5&css&js代码 029 CSS计数器 一、代码二、解释 该HTML代码定义了一个网页的结构和样式。在头部,通过CSS样式定义了body和h1-h2元素的样式。body元素的样式包括文本居中、计数器重置、字体颜色和背景颜色。h2元素的样式使用了CSS计数器来自动在标题前添加…

RIDE控制台中文显示为乱码问题解决方案【版本1.7.4.1】

1、方法: 将 C:\Users\user_name\AppData\Roaming\Python\Python37\site-packages\robotide\contrib\testrunner\testrunnerplugin.py文件中的第80行修改,改为utf-8 2、修改代码位置: 3、效果: 4、参考文章 试了前面的方法没有…

Python 深度学习第二版(GPT 重译)(一)

前言 序言 如果你拿起这本书,你可能已经意识到深度学习在最近对人工智能领域所代表的非凡进步。我们从几乎无法使用的计算机视觉和自然语言处理发展到了在你每天使用的产品中大规模部署的高性能系统。这一突然进步的后果几乎影响到了每一个行业。我们已经将深度学…

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的?内存是如何分配的?所以我们得知道如何计算结构体的大小?这就引出了我们今天所要探讨的内容:结构体内存对齐。 1.1 对齐规…

【Redis】Redis常见原理和数据结构

Redis 什么是redis redis是一款基于内存的k-v数据结构的非关系型数据库,读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 redis的数据类型 string:字符串 缓存对象,分布式ID,token,se…

1236 - 二分查找

代码 #include<bits/stdc.h> using namespace std; int a[1100000]; int main() {int n,x,l,r,p,mid,i;cin>>n;for(i1;i<n;i)cin>>a[i];cin>>x;l1;rn;p-1;while(l<r){mid(rl)/2;if(a[mid]x){pmid;break;}else if(x<a[mid]) rmid-1;else if(x…