我的编程空间,编程开发者的网络收藏夹
学习永远不晚

this 的六项正面与侧面是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

this 的六项正面与侧面是什么

这篇文章主要讲解了“this 的六项正面与侧面是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“this 的六项正面与侧面是什么”吧!

一、对象方法,"this"

通常创建对象来表示真实世界中的实体,如用户和订单等:

let user = {   name: "John",   age: 30 };

并且,在现实世界中,用户可以进行 操作:从购物车中挑选某物、登录和注销等。

在 JavaScript 中,行为(action)由属性中的函数来表示。

二、方法示例

刚开始,我们来教 user 说 hello:

let user = {   name: "John",   age: 30 };  user.sayHi = function() {   alert("Hello!"); };  user.sayHi(); // Hello!

这里我们使用函数表达式创建了一个函数,并将其指定给对象的 user.sayHi 属性。

随后我们像这样 user.sayHi() 调用它。用户现在可以说话了!

作为对象属性的函数被称为 方法。

所以,在这我们得到了 user 对象的 sayHi 方法。

当然,我们也可以使用预先声明的函数作为方法,就像这样:

let user = {   // ... };  // 首先,声明函数 function sayHi() {   alert("Hello!"); };  // 然后将其作为一个方法添加 user.sayHi = sayHi;  user.sayHi(); // Hello!
  •  *面向对象编程*

  • 当我们在代码中用对象表示实体时,就是所谓的 面向对象编程,简称为 “OOP”。

  • OOP 是一门大学问,本身就是一门有趣的科学。怎样选择合适的实体?如何组织它们之间的交互?这就是架构,有很多关于这方面的书,例如 E. Gamma、R.  Helm、R. Johnson 和 J. Vissides 所著的《设计模式:可复用面向对象软件的基础》,G. Booch  所著的《面向对象分析与设计》等。

三、方法简写

在对象字面量中,有一种更短的(声明)方法的语法:

// 这些对象作用一样 user = {   sayHi: function() {     alert("Hello");   } };  // 方法简写看起来更好,对吧? let user = {   sayHi() { // 与 "sayHi: function()" 一样     alert("Hello");   } };

如上所示,我们可以省略 "function",只写 sayHi()。

说实话,这种表示法还是有些不同。在对象继承方面有一些细微的差别(稍后将会介绍),但目前它们并不重要。在几乎所有的情况下,较短的语法是首选的。

四、方法中的 “this”

通常,对象方法需要访问对象中存储的信息才能完成其工作。

例如,user.sayHi() 中的代码可能需要用到 user 的 name 属性。

为了访问该对象,方法中可以使用 this 关键字。

this 的值就是在点之前的这个对象,即调用该方法的对象。

举个例

let user = {   name: "John",   age: 30,    sayHi() {     // "this" 指的是“当前的对象”     alert(this.name);   }  };  user.sayHi(); // John

在这里 user.sayHi() 执行过程中,this 的值是 user。

技术上讲,也可以在不使用 this 的情况下,通过外部变量名来引用它:

let user = {   name: "John",   age: 30,    sayHi() {     alert(user.name); // "user" 替代 "this"   }  };

……但这样的代码是不可靠的。如果我们决定将 user 复制给另一个变量,例如 admin = user,并赋另外的值给  user,那么它将访问到错误的对象。

下面这个示例证实了这一点:

let user = {   name: "John",   age: 30,    sayHi() {     alert( user.name ); // 导致错误   }  };   let admin = user; user = null; // 重写让其更明显  admin.sayHi(); // TypeError: Cannot read property 'name' of null

如果我们在 alert 中以 this.name 替换 user.name,那么代码就会正常运行。

五、“this” 不受限制

在 JavaScript 中,this 关键字与其他大多数编程语言中的不同。JavaScript 中的 this  可以用于任何函数,即使它不是对象的方法。

下面这样的代码没有语法错误:

function sayHi() {   alert( this.name ); }

this 的值是在代码运行时计算出来的,它取决于代码上下文。

例如,这里相同的函数被分配给两个不同的对象,在调用中有着不同的 “this” 值:

let user = { name: "John" }; let admin = { name: "Admin" };  function sayHi() {   alert( this.name ); }  // 在两个对象中使用相同的函数 user.f = sayHi; admin.f = sayHi;  // 这两个调用有不同的 this 值 // 函数内部的 "this" 是“点符号前面”的那个对象 user.f(); // John(this == user) admin.f(); // Admin(this == admin)  admin['f'](); // Admin(使用点符号或方括号语法来访问这个方法,都没有关系。)

这个规则很简单:如果 obj.f() 被调用了,则 this 在 f 函数调用期间是 obj。所以在上面的例子中 this 先是 user,之后是  admin。

在没有对象的情况下调用:this == undefined

我们甚至可以在没有对象的情况下调用函数:

function sayHi() {   alert(this); }  sayHi(); // undefined

在这种情况下,严格模式下的 this 值为 undefined。如果我们尝试访问 this.name,将会报错。

在非严格模式的情况下,this 将会是 全局对象(浏览器中的 window,我们稍后会在 全局对象 一章中学习它)。这是一个历史行为,"use  strict" 已经将其修复了。

通常这种调用是程序出错了。如果在一个函数内部有 this,那么通常意味着它是在对象上下文环境中被调用的。

解除 this 绑定的后果

如果你经常使用其他的编程语言,那么你可能已经习惯了“绑定 this”的概念,即在对象中定义的方法总是有指向该对象的 this。

在 JavaScript 中,this  是“自由”的,它的值是在调用时计算出来的,它的值并不取决于方法声明的位置,而是取决于在“点符号前”的是什么对象。

在运行时对 this 求值的这个概念既有优点也有缺点。一方面,函数可以被重用于不同的对象。另一方面,更大的灵活性造成了更大的出错的可能。

这里我们的立场并不是要评判编程语言的这个设计是好是坏。而是要了解怎样使用它,如何趋利避害。

六、箭头函数没有自己的 “this”

箭头函数有些特别:它们没有自己的 this。如果我们在这样的函数中引用 this,this 值取决于外部“正常的”函数。

举个例子,这里的 arrow() 使用的 this 来自于外部的 user.sayHi() 方法:

let user = {   firstName: "Ilya",   sayHi() {     let arrow = () => alert(this.firstName);     arrow();   } };  user.sayHi(); // Ilya

这是箭头函数的一个特性,当我们并不想要一个独立的 this,反而想从外部上下文中获取时,它很有用。在后面的 深入理解箭头函数  一章中,我们将深入介绍箭头函数。

感谢各位的阅读,以上就是“this 的六项正面与侧面是什么”的内容了,经过本文的学习后,相信大家对this 的六项正面与侧面是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

this 的六项正面与侧面是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++ 元编程对代码性能的影响:正面和负面因素是什么?

元编程对 c++++ 代码性能的影响既有正面也有负面影响:正面影响:避免运行时开销提高代码重用更好的类型安全负面影响:编译时间过长代码可读性下降性能损失元编程对 C++ 代码性能的影响元编程是一项强大的 C++ 技术,它允许程序在编译时操
C++ 元编程对代码性能的影响:正面和负面因素是什么?
2024-05-21

Java面向对象与类的核心是什么

这篇文章主要讲解了“Java面向对象与类的核心是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java面向对象与类的核心是什么”吧!什么是对象?一切客观存在的事物都是对象对象的组成属性、
2023-06-29

多面分析HarmonyOS与Android的特点是什么

这篇文章主要为大家展示了“多面分析HarmonyOS与Android的特点是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“多面分析HarmonyOS与Android的特点是什么”这篇文章吧。
2023-06-20

SAP MM MIGO界面里的'Via Delivery'选项是什么

这篇文章主要为大家分析了SAP MM MIGO界面里的Via Delivery选项是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“SAP MM MIGO
2023-06-05

Python开发者面向文档编程的正确姿势是什么

这篇文章将为大家详细讲解有关Python开发者面向文档编程的正确姿势是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述秦人不暇自哀,而后人哀之;后人哀之而不鉴之,亦使后人而复哀后人也!
2023-06-17

XP系统中开始菜单里面各选项的意思是什么

这篇文章将为大家详细讲解有关XP系统中开始菜单里面各选项的意思是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 一是Windows更新(Windows Update)。可以随时更新Win
2023-06-14

Java面向对象之多态的原理是什么与怎么实现

本文小编为大家详细介绍“Java面向对象之多态的原理是什么与怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java面向对象之多态的原理是什么与怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。何为多
2023-06-30

shell切换用户执行后面语句 su与su 的区别是什么

这篇文章主要介绍“shell切换用户执行后面语句 su与su 的区别是什么”,在日常操作中,相信很多人在shell切换用户执行后面语句 su与su 的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”s
2023-06-13

AmazonAurora与传统关系型数据库在扩展性方面的差异是什么

Amazon Aurora与传统关系型数据库在扩展性方面的主要差异在于Amazon Aurora是一个云原生的关系型数据库服务,具有更高的可伸缩性和性能。传统关系型数据库在处理大规模数据和高并发负载时通常会遇到性能瓶颈,难以实现有效的水平扩
AmazonAurora与传统关系型数据库在扩展性方面的差异是什么
2024-04-09

AmazonAurora与传统数据库服务在高可用性和容灾方面的差异是什么

Amazon Aurora是一种关系型数据库服务,它支持MySQL和PostgreSQL引擎,并具有高可用性和容灾特性。与传统数据库服务相比,Amazon Aurora在高可用性和容灾方面具有以下差异:多可用区部署:Amazon Auror
AmazonAurora与传统数据库服务在高可用性和容灾方面的差异是什么
2024-04-09

编程热搜

目录