ECMAScript6入门--Class对象

面向对象的语言有一个标志,那就是他们都有类的概念,经过类能够建立任意多个具备相同属性和方法的对象。函数

ECMAScript5中没有类的概念,所以它的对象和基于类的语言中的对象有所不一样。测试

Javascript生成对象的传统方法是经过构造函数来实现的this

function Person(name, age){
    this.name = name;
    this.age = age;
    this.sayHello = function(){
        return "Hello "+ this.name;
    }
}

var person = new Person("dahan",18);
person.sayHello();
//Hello dahan

上述这种方式由于和Javascript中声明方法的形式同样,因此对象和方法的区分并不明显,很容易形成混淆。spa

ES6引入了Class(类)的概念,咱们经过ES6的语法进行建立对象的时候,能够像Java语法同样,使用关键字class,用来定义类。固然,这种语法的功能,经过ES5也均可以实现,它只是让类的定义更加清晰,更容易理解。code

//类的定义
class Person {
    //ES6中新型构造器
    constructor(name) {
        this.name = name;
    }
    //实例方法
    sayName() {
        console.log("个人名字叫"+ this.name);
    }
}
//类的继承
class Programmer extends Person {
    constructor(name) {
        //直接调用父类构造器进行初始化
        super(name);
    }
    program() {
        cosnole.log("这是个人地盘");
    }
}
//运行测试
var person = new Person('lingxiao');
var coder = new Programmer('coder');

person.sayName();
//个人名字叫lingxiao
coder.sayName();
//个人名字叫coder
coder.program();
//这是个人地盘

下面来注意讲述一下上述代码中出现的语法。对象

constructor

constructor是类的默认方法,就像Java中的main方法同样,每一个类都必须有constructor方法。继承

在经过new实例化对象的时候,就会自动调用constructor方法,获得的也就是constructor返回的值。constructor默认返回当前类的实例对象(this),可是咱们也能够指定另一个对象,固然,这样就会致使实例化出来的对象,并非当前类的实例。图片

class Person {
    constructor(){
        var ob = new Object();
        return Ob;
    }
    sayHello(){
        return "Hello World"
    }
}
var person = new Person();
person.sayHello();
//Uncaught TypeError: person.sayHello is not a function

咱们在实例化对象的时候,ES6规定我使用new关键字,若是直接调用,会当成函数来调用。ip

class Person {
    constructor(name){
        this.name = name;
    }
};
var person = Person("dahan");
//Uncaught TypeError: Class constructor Person4 cannot be invoked without 'new'

this

在最开始的代码中,咱们看到了this,this在类中指向的就是实例自己,可是若是咱们在类的方法中使用了this,单独调用此方法的时候,就会出现错误。it

class Person{
    constructor(name){
        this.name = name;
    }
    sayHello() {
        return "Hello "+this.name
    }
}
var person  =  new Person("dahan");
var sayHello = person.sayHello;
sayHello();
//Uncaught TypeError: Cannot read property 'name' of undefined

针对这个咱们能够很简单的在构造方法中绑定this

class Person{
    constructor(name){
        this.name = name;
        this.sayHello = this.sayHello.call(this);
    }
    sayHello() {
        return "Hello "+this.name
    }
}

继承extend

咱们想要在一个类上扩展一些属性,但又不想修改原类,就用到了继承。

//类的继承
class Programmer extends Person {
    constructor(name,age) {
        this.age = age;//报错
        //直接调用父类构造器进行初始化
        super(name);
    }
    program() {
        cosnole.log("这是个人地盘");
    }
}

使用继承的时候,须要用super关键字来调用父类,super(name)就呆逼啊调用父类的constructor方法。

另外,咱们使用的继承的时候,super关键字也帮咱们改变了this的指向,因此咱们必需要先调用super方法,而后才能使用this。ES6要求,子类的构造函数必须执行一次super函数,不然就会报错。

最后

class关键字的出现,也让Javascript看上去更加像一个面向对象语言,愿Javascript越变越好越易用。

图片描述

相关文章
相关标签/搜索