详解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 attachEvent传递参数的办法
Dec 14 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
Jun 08 Javascript
前台js调用后台方法示例
Dec 02 Javascript
JS实现图片无间断滚动代码汇总
Jul 30 Javascript
浅谈javascript对象模型和function对象
Dec 26 Javascript
JavaScript实现拖拽网页内元素的方法
Apr 15 Javascript
基于Vue.js的表格分页组件
May 22 Javascript
JavaScript中的Array 对象(数组对象)
Jun 02 Javascript
js对象浅拷贝和深拷贝详解
Sep 05 Javascript
jQuery.form.js的使用详解
Jun 14 jQuery
详解JS构造函数中this和return
Sep 16 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
Jun 06 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源代码
2006/10/09 PHP
十天学会php之第七天
2006/10/09 PHP
PHP脚本的10个技巧(5)
2006/10/09 PHP
PHP array操作10个小技巧分享
2011/06/23 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
js实现楼层导航功能
2017/02/23 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
python+pyqt5编写md5生成器
2019/03/18 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
廉洁自律演讲稿
2014/05/22 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
紫日观后感
2015/06/05 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
领导离职感言
2015/08/03 职场文书
会计主管竞聘书
2015/09/15 职场文书
关于保护环境的建议书
2019/06/24 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript