详解ECMAScript6入门--Class对象


Posted in Javascript onApril 27, 2017

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

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

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

Javascript 相关文章推荐
用JavaScript显示随机图像或引用
Apr 21 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
Sep 24 Javascript
如何解决jQuery EasyUI 已打开Tab重新加载问题
Dec 19 Javascript
vue-router配合ElementUI实现导航的实例
Feb 11 Javascript
对Angular中单向数据流的深入理解
Mar 31 Javascript
vue+webpack实现异步加载三种用法示例详解
Apr 24 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
May 16 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
Jul 03 Javascript
Angular-UI Bootstrap组件实现警报功能
Jul 16 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
Aug 28 Javascript
Element UI框架中巧用树选择器的实现
Dec 12 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
Apr 28 Javascript
利用Vue v-model实现一个自定义的表单组件
Apr 27 #Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
Apr 26 #Javascript
微信小程序实现给循环列表添加点击样式实例
Apr 26 #Javascript
微信小程序 request接口的封装实例代码
Apr 26 #Javascript
微信小程序中hidden不生效原因的解决办法
Apr 26 #Javascript
微信小程序 flex实现导航实例详解
Apr 26 #Javascript
微信扫码支付零云插件版实例详解
Apr 26 #Javascript
You might like
php下过滤HTML代码的函数
2007/12/10 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
js对象的比较
2011/02/26 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
详解.vue文件中监听input输入事件(oninput)
2017/09/19 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
angular 实现同步验证器跨字段验证的方法
2019/04/11 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
2020/08/26 Javascript
web.py在模板中输出美元符号的方法
2014/08/26 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
Sql面试题
2013/03/20 面试题
师生聚会感言
2014/01/26 职场文书
心理健康日活动总结
2014/05/08 职场文书
法制宣传月活动方案
2014/05/11 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript