新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
传统的写法
<script>
function People(name){
this.name=name;
}
People.prototype.sayName=function(){
console.log(this.name);
}
var p=new People('zl');
p.sayName(); //zl
</script>
class ES6新写法
<script>
class People{ //class开头写,
constructor (name){ //当使用new来创建对象,会自动调用这个函数
this.name=name
}
sayName(){ //共享的方法(方法会挂载到原型身上)
console.log(this.name)
}
}
var p=new People('zl');
p.sayName(); //zl
</script>
ES6的类,完全可以看作构造函数的另一种写法
constructor
中的属性和方法会自动调用,sayName
中的方法会挂载到原型上,实现共享
注意:class没有提升
私有方法:
_bar(baz) {
return this.snaf = baz;
}
上面代码中,_bar方法前面的下划线,表示这是一个只限于内部使用的私有方法。但是,这种命名是不保险的,在类的外部,还是可以调用到这个方
法。
class 里的继承 extends super
extends [iksˈtendz] 延长延续
语法:
class Cat extends Animal{}
定义一个Cat
类,该类通过extends
关键字,继承了Animal
类的所有属性和方法。
例子
class Cat extends Animal{
constructor(x,y,name){
super(x,y);
this.name=name
}
}
注意:
子类必须在constructor
方法中调用super
方法,否则新建实例时会报错。这是因为子类没有自己的this
对象,而是继承父类的this
对象,然后对其进行加工。如果不调用super
方法,子类就得不到this
对象。
ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this))。
ES6 的继承机制完全不同,实质是
先创造父类的实例对象this(所以必须先调用super方法),然后再用子类的构造函数修改this。
静态方法 static
class People {
static print(){
console.log(100)
}
}
var p = new People();
p.print()//报错
所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承。而是直接通过类来调用,这就称为“静态方法”
这能这样调用
People.print();
父级的静态方法可以被子级继承
继承后子级可以调用父级的方法
class Foo {
static classMethod() {
console.log('我被继承了');
}
}
class Bar extends Foo {
}
Bar.classMethod();
ES6规定class只有静态方法没有静态属性。
网友评论