this可以调用父类的构造方法吗 是什么原因导致了JS中的this指向问题?

[更新]
·
·
分类:互联网
1404 阅读

this可以调用父类的构造方法吗

是什么原因导致了JS中的this指向问题?

是什么原因导致了JS中的this指向问题?

其他语言中的 thisC 语言支持独立的函数是没有 this 的
C 是支持独立的函数的但 this 只能出现在 class 方法里
Java 不支持独立的函数因此 this 只能出现在 class 方法里
PHP 支持独立的函数但 $this 只能出现在 class 方法里
Python 支持独立的函数但是 self 只能出现在 class 方法里
JavaScript 中的 this 指向问题JavaScript 语言中 this 被允许出现在独立函数里
每个函数都有一个隐式的 this 形参。将函数作为方法调用时,这个参数会被设置为用于访问该方法的对象。这和大多数面向对象语言中的 this(或 self)含义相同
但是 JavaScript 在「关联到对象的方法」与「独立函数」这两者之间,使用了单一的定义形式。这使 this 导致了许多程序员的困惑和 bug
ES6 中的箭头函数箭头函数基本形式
let func (num) gt num
let func () gt num
let sum (num1,num2) gt num1 num2
[1,2,3].map(x gt x * x)
箭头函数基本特点:
(1). 箭头函数 this 为父作用域的this,不是调用时的 this
(2). 箭头函数通过call和apply调用,不会改变this指向,只会传入参数
(3). 箭头函数没有原型属性
(4). 箭头函数在ES6 class中声明的方法为实例方法,不是原型方法
JavaScript 小历史1995 年 Netscape 在实现最早的 JavaScript 时,其内部的需求是这样的:
……这种 Java 的辅助语言必须「看起来像 Java」,保持易用性并「基于对象」,而不是像 Java 这样基于类。
……所有人都认可 Mocha(最早的 JS 引擎)将会「基于对象」但没有类。因为支持类将花费很长时间,并有与 Java 竞争的风险。
所以出于版权等因素,JavaScript 不能有 class,并且又要长得像 Java。这是需求背景一
但是在 ES6 中你知道的已经做出了相关的调整和改进

java中的super()是什么?

1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)3)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)5)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。   6)super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。   7)super()和this()均需放在构造方法内第一行。   8)尽管可以用this调用一个构造器,但却不能调用两个。   9)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。   10)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。   11)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字