Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >this 指向2 — 类中的this

this 指向2 — 类中的this

作者头像
用户9914333
发布于 2022-07-22 06:34:18
发布于 2022-07-22 06:34:18
27000
代码可运行
举报
文章被收录于专栏:bug收集bug收集
运行总次数:0
代码可运行

本文继续讨论 this 指向 问题,今天讨论:

类中的this

0 1

类上下文

this 在 类 中的表现与在函数中类似,因为类本质上也是函数,但也有一些区别和注意事项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Example{
     constructor(){
         this.eat=function(){
             console.log('go eatting!');
         }

    }
    rich(){
     console.log("I'm rich man!");
    }

    static drink(){
     console.log('drink water!');
    }
}

运行结果:

注:

通过static 关键字申明的方法,表示静态方法,实例对象是没有这个方法的,它是添加在类上面的。

通过:类名.方法名()调用

new 的过程:

this -> {}

{ age:18 }

{ age : 18, eat : function(){} }

return this;

注:通过this 添加的属性和方法,在实例对象上;其它方法都在this对象的原型链上,这是一个重点。

如下图:

0 2

派生类

派生类中写构造函数必须在super,否则报错, 如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Father{
        constructor() {
            this.age = 44 ;
        }
        swim(){
            console.log('go swimming !!!');
        }
}
class Son extends Father{
        constructor() {
        }
        eat(){
           console.log("eating ");
       }
}

报错:

Uncaught ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

在类son中,添加super方法即可,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
constructor() {
    super()
}

且注意: 在派生的类中, 在你可以使用'this'之前, 必须先调用super()

如下代码,也会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


constructor() {
    this.sex = '男';  
    super()
}

正确代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
constructor() {
    super()
    this.sex = '男';  
}

0 2

constructor 中为啥要加super

super关键字用于访问和调用一个对象的父对象上的函数。

因为子类没有自己的 this 对象,而是继承父类的 this 对象,然后对其进行加工,而 super 就代表了父类的构造函数。

super 虽然代表了父类 Father 的构造函数,但是返回的是子类 Son 的实例,即 super 内部的 this 指的是 Son.

因此 super() 在这里相当于

Father.prototype.constructor.call(this, props)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Son extends Father{
        constructor() {
            super();
            this.sex = '男';  
        }
        eat(){
           console.log("eating ");
       }
}

如上代码中,super() 所做的工作

1. 调用了Fahter 的constructor

2. 生成this ,绑定Father中的属性(相当于new Father)

3. 返回Son的实例(即this)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bug收集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TypeScript 面向对象程序设计(OOP)
在 JavaScript 中 ES6 之前我们使用函数(构造器函数)和基于原型来创建一个自定义的类,但这种方式总会让人产生困惑,特别是习惯了 Java、PHP 等面向对象编程的同学来说更加难以理解。
五月君
2020/05/19
8300
js面向对象编程_JavaScript高级编程
面向过程即分析出解决问题所需要的步骤,然后用函数将这些步骤一步步实现,使用的时候再一个个的一次调用就可以了;
全栈程序员站长
2022/09/24
1.1K0
js面向对象编程_JavaScript高级编程
class 类
抽象类是 TypeScript 中的一种特殊类,它不能直接被实例化,只能被其他类继承或实现。抽象类主要用于定义一些共享的属性和方法,并且可以声明一些抽象方法,这些抽象方法必须在子类中被实现。
程序员王天
2023/10/18
1580
javascript类(class)
class Person {} Person.propName = 'person'
用户7043603
2022/02/26
5880
JavaScript中的类(ES5+ES6)
ECMAScript 2015 中引入的 JavaScript 类实质上是 JavaScript 现有的基于原型的继承的语法糖。类语法不会为JavaScript引入新的面向对象的继承模型。
刘亦枫
2020/03/19
9610
typescript 多继承_说明类的继承和多态有什么作用
对于传统的 JavaScript 程序我们会使用函数和基于原型的继承来创建可重用的组件,但对于熟悉使用面向对象方式的程序员使用这些语法就有些棘手,因为他们用的是基于类的继承并且对象是由类构建出来的。 从 ECMAScript 2015,也就是 ES6 开始, JavaScript 程序员将能够使用基于类的面向对象的方式。 使用 TypeScript,我们允许开发者现在就使用这些特性,并且编译后的 JavaScript 可以在所有主流浏览器和平台上运行,而不需要等到下个 JavaScript 版本。
全栈程序员站长
2022/09/16
1.2K0
typescript 多继承_说明类的继承和多态有什么作用
ES6中的对象与类
面向对象更贴近我们的实际生活,可以使用面向对象描述现实世界事物,但是事物分为具体的事物和抽象的事物
星辰_大海
2020/10/15
5400
ES6中的对象与类
【愚公系列】2021年12月 Typescript-类的使用(封装,继承,多态)
ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。
愚公搬代码
2022/12/01
5540
对象与类
1.对象与类 1.1对象 对象是由属性和方法组成的:是一个无序键值对的集合,指的是一个具体的事物 属性:事物的特征,在对象中用属性来表示(常用名词) 方法:事物的行为,在对象中用方法来表示(常用动词) 1.1.1创建对象 //以下代码是对对象的复习 //字面量创建对象 var ldh = { name: '刘德华', age: 18 } console.log(ldh); //构造函数创建对象 function Star(name, age) { this.name
梨涡浅笑
2020/10/27
4940
对象与类
JavaScript 进阶教程(3)---让你彻底搞懂原型链和继承
关于原型在JavaScript 进阶教程(1)--面向对象编程这篇文章已经讲过了,今天简单来复习一下。
AlbertYang
2020/09/08
5140
JavaScript 进阶教程(3)---让你彻底搞懂原型链和继承
Class(类)
class 的本质是 function。 它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。
心念
2023/01/12
6720
这些js原型及原型链面试题你能做对几道
在面试过程中,频频被原型相关知识问住,每次回答都支支吾吾。后来有家非常心仪的公司,在二面时,果不其然,又问原型了!
loveX001
2022/10/02
5080
关于this指向
爱学习的前端歌谣
2023/10/18
1420
关于this指向
JS学习笔记
内部函数被返回到外部,函数本身保留了父函数的AO,即使父元素执行完了,取消对AO的引用,但依旧被子函数保留下来了,就形成了闭包。
小丞同学
2021/08/16
4060
typeScript的基础认识
世间万物皆对象
2024/03/20
1190
JS面试题-JS实现继承的方法(共6种)
① 引用类型的属性被所有实例共享。 ② 在创建 Child 的实例时,不能向Parent传参
用户10106350
2022/10/28
7230
JS面试题-JS实现继承的方法(共6种)
原型式继承和类式继承
Java和JavaScript都是面向对象的语言,但二者的继承方式截然不同。前者采用类式继承(classical inheritence),也是大多数面向对象语言的继承方式。而后者采用原型式继承(prototype ineritence),因此称JavaScript为基于对象更加合适。
Chor
2019/11/07
1.5K0
ES6之class的继承
class语法为我们提供了构造函数的语法糖,响应的,也给我们提供了ES5通过原型链实现继承提供了extends关键字实现继承。继承这个概念对面后台应该也是非常常见。
wade
2020/04/23
5120
【鸿蒙开发基础】ArkTS基础知识 - 类、接口及泛型
前面我们学习了 ArkTS基础知识 - 声明变量、常量、类型和函数,本文我们继续学习鸿蒙开发中使用ARKTS的类、接口、泛型、字段、方法、继承以及模块导出和导入的概念,为鸿蒙应用开发者提供了基础理论支持。
小帅聊鸿蒙
2024/10/31
4560
ECMAScript中类与继承详解(Java对比学习)
如果声明一个一个类的时候没有声明构造函数,那么会默认添加一个空的构造函数,构造函数在new实例化一个对象的时候会被调用
coder_koala
2019/07/30
4340
相关推荐
TypeScript 面向对象程序设计(OOP)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验