详解ECMAScript6入门--Class对象
面向对象的语言有一个标志,那就是他们都有类的概念,通过类可以创建任意多个具有相同属性和方法的对象。
ECMAScript5中没有类的概念,因此它的对象和基于类的语言中的对象有所不同。
Javascript生成对象的传统方法是通过构造函数来实现的
functionPerson(name,age){ this.name=name; this.age=age; this.sayHello=function(){ return"Hello"+this.name; } } varperson=newPerson("dahan",18); person.sayHello(); //Hellodahan
上述这种方式因为和Javascript中声明方法的形式一样,所以对象和方法的区分并不明显,很容易造成混淆。
ES6引入了Class(类)的概念,我们通过ES6的语法进行创建对象的时候,可以像Java语法一样,使用关键字class,用来定义类。当然,这种语法的功能,通过ES5也都可以实现,它只是让类的定义更加清晰,更容易理解。
//类的定义 classPerson{ //ES6中新型构造器 constructor(name){ this.name=name; } //实例方法 sayName(){ console.log("我的名字叫"+this.name); } } //类的继承 classProgrammerextendsPerson{ constructor(name){ //直接调用父类构造器进行初始化 super(name); } program(){ cosnole.log("这是我的地盘"); } } //运行测试 varperson=newPerson('lingxiao'); varcoder=newProgrammer('coder'); person.sayName(); //我的名字叫lingxiao coder.sayName(); //我的名字叫coder coder.program(); //这是我的地盘
下面来注意讲述一下上述代码中出现的语法。
constructor
constructor是类的默认方法,就像Java中的main方法一样,每个类都必须有constructor方法。
在通过new实例化对象的时候,就会自动调用constructor方法,得到的也就是constructor返回的值。constructor默认返回当前类的实例对象(this),但是我们也可以指定另外一个对象,当然,这样就会导致实例化出来的对象,并不是当前类的实例。
classPerson{ constructor(){ varob=newObject(); returnOb; } sayHello(){ return"HelloWorld" } } varperson=newPerson(); person.sayHello(); //UncaughtTypeError:person.sayHelloisnotafunction
我们在实例化对象的时候,ES6规定我使用new关键字,如果直接调用,会当成函数来调用。
classPerson{ constructor(name){ this.name=name; } }; varperson=Person("dahan"); //UncaughtTypeError:ClassconstructorPerson4cannotbeinvokedwithout'new'
this
在最开始的代码中,我们看到了this,this在类中指向的就是实例本身,但是如果我们在类的方法中使用了this,单独调用此方法的时候,就会出现错误。
classPerson{ constructor(name){ this.name=name; } sayHello(){ return"Hello"+this.name } } varperson=newPerson("dahan"); varsayHello=person.sayHello; sayHello(); //UncaughtTypeError:Cannotreadproperty'name'ofundefined
针对这个我们可以很简单的在构造方法中绑定this
classPerson{ constructor(name){ this.name=name; this.sayHello=this.sayHello.call(this); } sayHello(){ return"Hello"+this.name } }
继承extend
我们想要在一个类上扩展一些属性,但又不想修改原类,就用到了继承。
//类的继承 classProgrammerextendsPerson{ constructor(name,age){ this.age=age;//报错 //直接调用父类构造器进行初始化 super(name); } program(){ cosnole.log("这是我的地盘"); } }
使用继承的时候,需要用super关键字来调用父类,super(name)就呆逼啊调用父类的constructor方法。
另外,我们使用的继承的时候,super关键字也帮我们改变了this的指向,所以我们必须要先调用super方法,然后才能使用this。ES6要求,子类的构造函数必须执行一次super函数,否则就会报错。
最后
class关键字的出现,也让Javascript看上去更加像一个面向对象语言,愿Javascript越变越好越易用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。