在javascript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等
在ES6中新增加了类的概念,可是使用class关键字来声明一个类
创建类:
Class Star {
//class body
constructor(usename){
//构造器函数,和java中类似用于初始化一个类,一个类中默认有一个constructor函数,在创建对象的时候自动调用
this.usename=usename
}
eat(){
console.log(this.usename+"在吃饭!")
}
}
需要注意的是javascript初始化属性与java不同,前者是使用this来指向对象属性进行赋值,在类中不用写这个属性,而后者也是使用this或不使用,但是类中要写这个属性
类中的函数是不用写function关键字来进行修饰的
多个函数之间不需要使用逗号进行分割
创建对象:
const star=new Star('张三')
类的继承
javascript的类的继承于java中的类的继承十分相似,都是通过extends关键字进行一个继承
我们先来看看java的继承:
package tets;
public class parent {
String name="";
int age=0;
public parent(String name, int age) {
this.name = name;
this.age = age;
}
public void say(){
System.out.println("我是"+name+",今年"+age+"岁。");
}
}
package tets;
public class Child extends parent{
public Child(String name, int age) {
super(name, age);
}
}
可以看到父类若是有参构造子类的构造方法中就得使用super关键字(IDEA智能,书写时若不写会报错)
js也是如此,如果子类要使用继承父类的某个方法,而且要使用父类的数据时就需要在构造函数中使用super关键字,例子如下:
class Father {
constructor(x,y){
this.x=x;
this.y=y
}
sum(){
console.log(this.x+this.y)
}
}
class Son extends Father {
constructor(x,y){
//super(x,y)
this.x=x;
this.y=y
}
}
var son=new Son(1,2);
son.sum(); //把上面super(x,y)注解,将会报错,因为Son的构造方法中的x,y赋值给的是Son对象中的x,y属性,而父类的sum方法调用的是父类的x,y属性,此时父类没有构造,没有初始化,也就没有x,y属性,进行this.x和this.y时就会出现属性未定义的错误
与java一样super关键字是指向父类的引用super()是调用父类的构造器,而super. 可以去访问父类的普通函数,但是这里注意的是super关键字不能够访问属性
还有一点与java一样spuer()调用父类的构造方法只能在子类构造方法的第一行进行调用(this之前)
ES6中的类没有变量提升(如var),所以必须先定义类,才能通过类实例化对象
类里面的公有属性和方法一定要加this使用
this的指向:
在构造函数constructor中的this指向是当前类的实例化对象,而普通方法的this指向的是它的调用者,谁调用这个方法,这个方法中的this就指向谁