传统的对象生成,大都是通过构造器生成,这是与其他传统语言,如java、c等不同的,这很容易让新入门学习的人感到困惑。因此,在此基础上,es6新标准推出一种新的生成实例化对象的方法---class类。
//传统的对象生成
function Point(x,y){
this.x=x;
this.y=y;
};
Point.prototype.toString = function(){
return '("+this.x+","+this.y+")';
};
var p = new Point(1,2);
console.log(p.toString());
/新的写法
class Person{
//属性
constructor(age,name){//构造方法,对应构造函数,必须要有
this.age=age;
this.name=name;
};
//方法
toString(){
return this.age+"---"+this.name;
};
};
var p1 = new Person(12,"aaa");//直接传入
console.log(p1.age,p1.name);//12 aaa
console.log(p1.toString());
上面的代码,通过class定义了一个类,类里面有一个方法“constructor”方法,这是构造方法,而里面的this这是实例对象。这个方法和构造函数一样。
需要注意的是,每个类都必须有构造方法,如果一个空的类,里面没有写,会被默认加上构造方法;而类里面的方法,其实和利用构造函数在原型链上写方法是一样的,
//在类里面写方法,和使用构造器在原型上写方法一样
/*
class Point{
constructor(...set){
...
}
toString(){
...
}
toValue(){
...
}
}
等同于
Point.prototype = {
toString() {},
toValue() {},
}
在类的实例上调用方法,其实就是在原型上调用方法。
*/
在以前我们使用构造函数创建对象时,生成的子类,是无法直接继承的,需要用到原型。而通过class则解决了这个问题,我们可以通过super直接继承父类的属性和方法
//继承
class Cars{
constructor(name,jq){
this.name=name;
this.jq=jq;
};
Run(){
console.log("跑起来了!")
}
};
class Bus extends Cars{
constructor(name,jq,id){
super(name,jq);//必须使用super后,才能使用this
this.id=id;
};
kuairun(){
super.Run;
console.log("跑的很快!");
}
};
var bus = new Bus("大奔",1190,"123129kkosda");
console.log(bus.name,bus.jq,bus.id);
bus.Run();
bus.kuairun();
上面的例子中,Bus是继承Cars的,我们通过super,在构造方法内继承属性,但需要注意的是,我们必须先使用super,才能使用this关键字,否者会报错。下面的方法继承,看似是在方法内的,其实他们是2个独立的,相互不会影响。
关于class的原型,prototype 、__proto__,和构造函数类似,对象都有__proto__
属性,指向对应的构造函数的prototype
属性
console.log(Bus.__proto__,);//Cars
console.log(Bus.prototype.__proto__);//Cars.prototype