es6新增了一种定义对象实例的方法,使用class关键字定义类,与class相关的知识点也逐步火热起来,但是部分理解起来相对抽象,简单对class相关的知识点进行总结,更好的使用class。
关于类有两个概念,1,类自身,;2,类的实例对象
总的来说:静态的是指向类自身,而不是指向实例对象,主要是归属不同,这是静态属性的核心。
难点一:静态方法的理解
class Foo { static classd() { return 'hello'; }
}
2、静态方法
C++中,若类的方法前加了static关键字,则该方法称为静态方法,反之为实例方法。静态方法为类所有,可以通过对象来使用,也可以通过类来使用。但一般提倡通过类名来使用,因为静态方法只要定义了类,不必建立类的实例就可使用。静态方法只能调用静态变量。
定义
若类的方法前加了static关键字,则该方法称为静态方法,反之为非静态方法。
为什么使用静态方法
静态方法的好处就是不用生成类的实例就可以直接调用。
static方法修饰的成员不再属于某个对象,而是属于它所在的类。只需要通过其类名就可以访问,不需要再消耗资源反复创建对象。
在类第一次加载的时候,static就已经在内存中了,直到程序结束后,该内存才会释放。
静态方法中this指向:this指向类而不是类的实例
class Foo {
static ba() {
this.num();
}
static num () {
console.log('hello');
}
num() {
console.log('world');
}
}
Foo.ba() // hello
继承相关:静态方法可以被子类继承, 构造方法不能被继承。
1.调用父类的成员方法
父类
package expression; public class Computer { String SayHellow(){ return "welcome"; }
子类
package expression; public class Pad extends Computer{ String SayHellow(){ return "welcome"+"你好呀"; }
如果我要让欢迎语“welcome”换为“萨瓦迪卡”,父类和子类都要修改,这时可以用super继承关键字
package expression; public class Pad extends Computer{ String SayHellow(){ return super.SayHellow()+"你好呀"; }
2.调用父类的构造方法
package expression; public class Pad extends Computer{ public Pad(){ //初始化 super();//调用父类的构造方法 } String SayHellow(){ //调用父类的成员方法 return super.SayHellow()+"你好呀"; }
3.调用父类的属性
package expression; public class Pad extends Computer{ public Pad(){ //调用父类的属性 this.screen = super.screen;//this 和super 是一样的,只不过this是本类,super是父类 } String SayHellow(){ //调用父类的成员方法 return super.SayHellow()+"你好呀"; } }
难点二:静态属性的理解,以及和实列属性的区别
理解了静态的本质就知道静态属性是class类自身的属性
相对的实例属性是指类的实例的属性,调用时使用 new Foo().'属性名'
语法
class 类名{ 方法名(){ //方法体 } } var 变量名 = new 类名()
定义实例属性的方法
// 声明一个类 class Stuen{ read(){ console.log('stuen read()...') } } // 实例化一个对象 var s1 = new Stuen() s1.read()
// 构造方法 class Student{ constructor(name,age,sex){ console.log('构造方法') // 实例属性 this.name = name; this.age = age; this.sex = sex; } // 实列方法 read(){ console.log('student read()....'+this.name); } } // 实列化对象 var s1 = new Student('tom',20,'男') s1.read(); console.log(s1.name) console.log(s1.age) console.log(s1.sex)
总结:优势与弊端
在一些系统中使用非常频繁的方法都使用静态方法可以提高系统性能
为了方便,不用实例化,但这样程序编译运行时就占用了系统资源
静态的属性和方法在程序启动的时候,就全部装入内存的,而不管这些方法、属性以后有没有用到。即使是没有人再访问程序,这部分内存仍然不会释放。还有就是,所有访问者看到的静态属性的数据几乎都是一样的,比如A用户设置了UserName这个属性,B用户访问的时候,得到的UserName仍然是A用户设置的那个。这种特性,如果用在固定数据中,那不会有太大问题,比如连接字符串之类的。