javascript中this和super用法

"this",作为一个特殊的关键字,它的规则如下: 
1。可以表示构造函数传递。this(a,b)表示调用另外一个构造函数。这里面的this就是一个特殊语法,不是变量,没有什么类型。 
2。可以在一个类的非static成员内部使用,表示当前这个对象。此时,this就是一个final的普通变量,它有静态类型,就是这个类C本身;它有动态类型,就是当前这个对象的类型。你可以对它调用成员函数,把它传递给别的函数,等等等等。只要一个C类型的final变量可以出现的地方,它就可以出现。


"super"。它和"this"类似,但是也有不同的地方。 
1。表示调用父类的构造函数。也是一个特殊语法,不是变量,没有什么类型。


2。可以在一个类的非static成员内部使用。比如super.method()。 
但是,注意,这个super.method()只是长得跟some_var.method()一样,一个语法糖而已。实质上,"super"根本不是一个变量。


为什么不是?因为如果是就坏了。java里面有一个金科玉律:任何public非static函数的调用都是多态的。 
所以,如果super是个变量,也指向当前对象,那么,不管super的静态类型是什么super.method()必然调用的是子类的那个版本,而不会是我们期望的,静态地选择父类的那个版本。


所以,你只要把super.xxx看成一个特殊的语法,比如理解为“super::xxx”就好了。


既然super不是一个变量,那么不能把它象一个普通变量那样"==",或者传递给某个函数就看起来很正常了,是么?何况,你其实也用不着它,有this你这些要求就都可以办到了。


3。super的另外一个作用是调用父类的protected函数。只有通过"super"这个魔咒,我们才能操作父类的protected成员,别无它法。
JavaScript ,`super` 方法是用于调用父类方法的关键字。它可以在子类使用,以便调用父类的构造函数、静态方法和原型方法。使用 `super` 方法可以避免在子类重复编写父类的代码。 在 ES6 ,使用 `super` 方法要注意以下几点: 1. 在子类的构造函数,必须先调用 `super()` 方法,以便完成父类的初始化。 2. 在子类的原型方法,可以使用 `super` 关键字调用父类的同名方法。 3. 在子类的静态方法,也可以使用 `super` 关键字调用父类的同名静态方法。 下面是一个简单的示例,演示了如何在子类使用 `super` 方法: ```javascript class Animal { constructor(name) { this.name = name; } speak() { console.log(this.name + ' makes a noise.'); } } class Dog extends Animal { constructor(name) { super(name); // 调用父类的构造函数 } speak() { super.speak(); // 调用父类的同名方法 console.log(this.name + ' barks.'); } } let d = new Dog('Mitzie'); d.speak(); // 输出 "Mitzie makes a noise." 和 "Mitzie barks." ``` 在上面的示例,`Dog` 类继承自 `Animal` 类。在 `Dog` 类的构造函数,我们使用 `super(name)` 调用了父类的构造函数,并传入了一个参数。在 `Dog` 类的 `speak` 方法,我们使用 `super.speak()` 调用了父类的同名方法,并在其后面添加了自己的逻辑。最终,我们创建了一个 `Dog` 对象 `d`,并调用了它的 `speak` 方法,输出了两行信息。第一行信息是来自父类的,第二行信息是来自子类的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值