欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解ECMAScript6入门--Class对象

程序员文章站 2023-12-09 22:35:51
面向对象的语言有一个标志,那就是他们都有类的概念,通过类可以创建任意多个具有相同属性和方法的对象。 ecmascript5中没有类的概念,因此它的对象和基于类的语言中的对...

面向对象的语言有一个标志,那就是他们都有类的概念,通过类可以创建任意多个具有相同属性和方法的对象。

ecmascript5中没有类的概念,因此它的对象和基于类的语言中的对象有所不同。

javascript生成对象的传统方法是通过构造函数来实现的

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中声明方法的形式一样,所以对象和方法的区分并不明显,很容易造成混淆。

es6引入了class(类)的概念,我们通过es6的语法进行创建对象的时候,可以像java语法一样,使用关键字class,用来定义类。当然,这种语法的功能,通过es5也都可以实现,它只是让类的定义更加清晰,更容易理解。

//类的定义
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关键字,如果直接调用,会当成函数来调用。

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,单独调用此方法的时候,就会出现错误。

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越变越好越易用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。