JavaScript学习 this对象

前言

我只想说,JS也太难懂了。
参考文章:https://juejin.im/post/5b6676e6f265da0fa00a3a12

类别

1 全局环境中的“this”

在全局环境中, this相当于全局对象 global。但这只在 node中才有效。
原因是在JavaScript文件中, this等同于 module.exports而不是 global

2 函数中的“this”

函数中的 this值通常是由函数的调用方来定义。因此,每次执行函数,函数内的 this值可能都不一样。(严格模式产生影响)
如果我们使用 node运行下面的代码,得到的输出为 true 。如果在文件的顶部添加 “use strict”(严格模式),并再次运行它,将会得到一个 false输出,因为现在的 this值为 undefined 。

function rajat() {
   
  console.log(this === global)
}
rajat()

3 构造函数中的“this”

JavaScript没有特定的构造函数。我们所能做的就是使用 new运算符将函数调用转换为构造函数调用,如上一节所示。
构造函数被调用时,会创建一个新对象并将其设置为函数的 this参数。构造函数会隐式的返回这个对象,除非我们明确的返回了另外一个对象。
return语句不会覆盖构造函数调用的唯一情形是,return语句返回的不是一个对象。在这种情况下,对象将包含原始值。

4 方法中的“this”

A 当函数作为对象的方法被调用时, this指向的是该对象,也称为函数调用的接收器(receiver)。
假设 hero对象有一个 dialogue方法 ,那么 dialogue中的 this值指向 hero本身。此时的 hero也被称为 dialogue方法调用的接收者。
B 如果我将 dialogue的引用存储在另一个变量中,并将该变量作为函数调用。 node运行代码 , this将返回 undefined ,因为该方法已经丢失了接收器。 this此时指向 global ,而不是 hero 。

const hero = {
   
  heroName: "Batman",
  dialogue() {
   
    console.log(`I am 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中,使用class语法定义类的确能够提供更接近传统面向对象编程的语法和特性,但也存在一些缺点: 1. 兼容性问题:class语法是ES6中新增的语法,不是所有的浏览器都支持,需要进行兼容性处理。 2. 学习成本:class语法虽然更接近传统面向对象编程语言的语法,但仍然需要理解JavaScript中原型链的机制,以及class语法的特性和限制,需要一定的学习成本。 3. 类成员属性和方法的访问控制问题:class语法中定义的类成员属性和方法默认是公有的,无法实现私有属性和方法的效果。可以通过使用闭包或Symbol等方式实现私有属性和方法,或者使用TypeScript等语言进行开发。 4. 继承的问题:类继承机制是基于原型链的,因此可能会存在一些意想不到的继承行为。此外,在继承时需要注意父类的构造函数和属性的调用顺序,以及super关键字的使用。 5. this指向的问题:在class语法中定义的方法中,this关键字的指向可能会出现问题。在类的方法中使用箭头函数可以避免这个问题。 6. 类方法的性能问题:在class语法中,类的方法定义在prototype上,因此可能会存在一定的性能问题。可以使用静态方法或者将方法定义在类的构造函数中来避免这个问题。 需要注意的是,虽然class语法能够提供更接近传统面向对象编程的语法和特性,但JavaScript本身并不是一种纯粹的面向对象编程语言,因此需要结合JavaScript的其他特性进行开发,以获得更好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值