ES6class继承

ES6中的class继承

1、关于class的本质
定义一个类
class Person{
constructor(skin,language){
this.skin=skin;
this.language=language;
}
say(){
console.log(‘I am a Person’)
}
}
由于class本质还是一个function,因此它就会拥有一个的prototype属性,当new一个class时,会把class的porototype属性赋值给这个新对象的 __proto__属性。(prototype是函数的一个属性,它是一个指针。对于构造函数来说,prototype是作为构造函数的属性。prototype也可以是一个对象,prototype是对象实例的原型对象。所以prototype即是属性,又是对象。好绕啊~~~~
在new一个对象时,可以理解为一个对象没有ptototype属性,所以把ptototype给一个对象的 proto
1、console.log(typeof Person);//function
2、var p = new Person(‘unkown’,‘unknown’);
3、console.log§;//Person {skin: “unkown”, language: “unknown”}
4、console.log( proto==Person.prototype);//ture
new一个对象时,会经历以下几个步骤(摘自javascript高级程序设计):
(1)创建一个对象;
(2)将构造函数的作用域赋值给新对象(因此this就指向了这个新对象);
(3)执行构造函数中的代码(为这个新对象添加属性);
(4)返回新对象
由此可见console.log§的结果。

2、constructor方法
constructor 方法是默认的方法,在new一个对象时,自动调用该方法。在一个类中必须有一个constructor,如果没有定义,则会默认添加一个。
1、constructor(){}

3、class的继承
和其他面向对象语言一样,class用extends实现继承
1)子类没constructor时
1、class American extends Person{
aboutMe(){
console.log(this.skin+’'this.language)
}
子类American继承父类Person,子类没用定义constrcutor,则默认添加一个,并且在constrcutor中调用super函数,相当于调用父类的构造函数。调用super函数是为了在子类中获得父类的this,调用之后this指向子类。也就是父类.prototype.constructor.call(this)。

class Chinese extends Person{
constructor(skin,language,positon){
//console.log(this);//报错
super(skin,language);
//super();
//console.log(this);调用super后得到了this,不报错
this.positon=positon;
}
aboutMe(){
console.log(this.skin+’ ‘+this.language+’ ‘+this.positon);
}
}
2)子类有constructor
子类必须在constructor方法中调用super方法,否则new实例时会报错。因为子类没有自己的this对象,而是继承父类的this对象。如果不调用super函数,子类就得不到this对象。super()作为父类的构造函数,只能出现在子类的constructor()中;但是super指向父类的原型对象,可以调用父类的属性和方法。
class Chinese extends Person{
constructor(skin,language,positon){
//console.log(this);//在没有调用super之前输出this会报错
super(skin,language);
//super();//不给父类构造函数传参,父类的构造数的值为undefined
console.log(this);
this.positon=positon;
}
aboutMe(){
console.log(this.x+’ ‘+this.y+’ '+this.positon);
}
}
4、实例化子类对象
实例化子类对象时,子类对象可以拥有父类的属性和方法,子类对象还可以拥有自己的属性和方法。比如chinese 继承了父类的say方法,还拥有自己的chinese say方法。最后两行代码表示
1)子类的__proto__属性,表示构造函数的继承,总是指向父类。

2)子类的prototype属性的__proto__属性表示方法的继承,总是指向父类的prototype属性
1.var american = new American(‘white’,‘English’);
2.var chinese =new Chinese(‘yellow’,‘chinese’,‘changsha’);
3.chinese.say();//I am a Person
4.chinese.chinesesay();//I am a Person I am a Chinese
5.console.log(American.proto===Person);//true
6.console.log(American.proto);//父类对象
7.console.log(American.prototype.proto===Person.prototype);//true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值