ES6面向对象
constructor 构造函数
// 构造函数就是new 类名 实例化对象时执行的函数
// 所有类中的构造函数都叫constructor
// 当我们new 类名()就是执行了constructor这个函数
// let b=new Box(5,10);
// 对象中构造函数与当前对象的类是相同
// console.log(b.constructor===Box);
代码演示
// var arr=[1,2,3];
// console.log(arr.constructor===Array);
// var date=new Date();
// console.log(date.constructor===Date);
// var str="aaaa";
// console.log(str.constructor===String);
// var bool=true;
// console.log(bool.constructor===Boolean);
// var ul=document.querySelector("ul");
// ul.addEventListener("click",clickHandler);
function clickHandler(e){
// if(e.target.nodeName!=="LI") return;
// if(e.target.constructor!==HTMLLIElement) return;
// if(e.target.constructor===HTMLUListElement) return;
// HTMLDivElement div
// var div=new HTMLDivElement();//不可以 因为这是接口
// HTMLUListElement ul
// HTMLTableElement table
// HTMLTableRowElement tr
// HTMLTableColElement td
// HTMLBodyElement body
// HTMLDocument document
// HTMLElement 所有元素
}
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
// let arr=new Array();
// let date=new Date();
// let str=new String();
// 对于语言来说,其他语言的构造函数比较丰富,可以有多个,并且传参可以不同
// 但是对于js来说,构造函数有且仅有一个,并且任何构造函数的名字固定是constructor
// 可以认为constructor与类名相等
// class Box{
// a=1;
// // 如果不需要执行任何内容,类中构造函数可以默认不填写
// play(){
// console.log(this.a);
// }
// }
// let b=new Box();
// b.play();
class Box{
// 这种属性叫做对象属性,相对于static来说他就是动态属性
a=1;
// static 静态的
// 通过static设置的静态属性和静态方法,都只能使用类调用这种方式
static a=2;
constructor(_a){
// 构造函数执行时,this就是创建的对象
this.a=_a;
}
play(){
console.log(this.a);
// this是什么 this就是执行当前函数的对象
}
// 静态方法
static run(){
//虽然也可以在这里写this,但是我禁止大家在这里使用this
// 禁止在静态方法中写this
console.log(Box.a);
}
}
// let b=new Box();
// console.log(b.a);
// console.log(Box.a);
// 类当中的属性,在实例化时会设置给实例化的对象
// Box类中的属性a,因为实例化生成了o1和o2两个对象,因此,o1和o2两个对象都拥有了a属性
// 这个对象的属性现在就属于这两个各自的对象了,他们没有任何关系
// 他们都有这个a属性,属性值是各自的
// var o1=new Box(5);
// var o2=new Box(6);
// o1.a=100;
// o2.a=1000;
// o1.play();
// o2.play();
// console.log(o1,o2);
ES6面向对象的继承
class A{
a=0;
b=0;
static abc=10;
constructor(_a,_b){
this.a=_a;
this.b=_b;
}
sum(){
this.a++;
this.b++;
console.log(this.a+this.b);
}
run(){
console.log("aaaaa");
}
}
class B extends A{
// 在js中静态属性和方法也可以继承
c=0;
constructor(_a,_b,_c){
// 如果继承后,写构造函数必须写
super(_a,_b);//超类的构造函数,执行了父类的构造函数,并且传参进入
this.c=_c;
}
count(){
console.log(this.a*this.b);
}
// 因为继承后有sum的方法了,如果这样写,就相当于将这个sum的方法重写覆盖
// 不会再执行超类的sum方法,而只执行当前sum方法
sum(){
this.a+=2;
this.b+=2;
console.log(this.a+this.b);
}
// 既可以执行超类中原有的run方法,又可以在这个基础上增加自己新内容
run(){
super.run();//执行了超类的run方法
console.log("bbbb");
}
}
let o1=new A(3,5);
// o1.sum();
// o1.run();
let o2=new B(6,7,10);
// o2.sum();
// o2.count();
// console.log(B.abc);
o2.run();
// 继承后的类,方法有三种处理
// 1\完全继承 不需要重写这个方法,自动就有,超类的方法执行什么,这个类就会执行什么
// 2\重写覆盖 只需要在这个类中重写这个方法就可以覆盖继承过来的内容
// 3\在原方法中增加新的内容 重新该方法,并且执行super.方法名这样就可以执行超类方法,后面可以自己添加

浙公网安备 33010602011771号