详解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 相关文章推荐
收集的一些Array及String原型对象的扩展实现代码
Dec 05 Javascript
重载toString实现JS HashMap分析
Mar 13 Javascript
JQueryEasyUI datagrid框架的进阶使用
Apr 08 Javascript
js中判断对象是否为空的三种实现方法
Dec 23 Javascript
初识Javascript小结
Jul 16 Javascript
jQuery.extend 函数及用法详细
Sep 06 Javascript
AngularJS手动表单验证
Feb 01 Javascript
使用伪命名空间封装保护独自创建的对象方法
Aug 04 Javascript
BootStrapTable 单选及取值的实现方法
Jan 10 Javascript
javascript实现导航栏分页效果
Jun 27 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
Sep 05 Javascript
JS实现炫酷轮播图
Nov 15 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
js实现简单选项卡制作
2020/08/05 Javascript
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
python实现的文件同步服务器实例
2015/06/02 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
通过CSS3的object-fit来调整图片适配尺寸的技巧简介
2016/02/27 HTML / CSS
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
大学毕业自我鉴定范文
2014/02/03 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
学习雷锋精神心得体会范文
2014/03/12 职场文书
煤矿安全生产标语
2014/06/06 职场文书
爱心捐书活动总结
2014/07/05 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
刑事附带民事起诉状
2015/05/19 职场文书
机械生产实习心得体会
2016/01/22 职场文书