详解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 相关文章推荐
ExtJs之带图片的下拉列表框插件
Mar 04 Javascript
公共js在页面底部加载的注意事项介绍
Jul 18 Javascript
22点关于jquery性能优化的建议
May 28 Javascript
kindeditor修复会替换script内容的问题
Apr 03 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
Aug 07 Javascript
jQuery中map函数的两种方式
Apr 07 jQuery
js实现手机web图片左右滑动效果
Dec 29 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
Mar 08 Javascript
Vue自定义指令封装节流函数的方法示例
Jul 09 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
Oct 01 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
Apr 02 Javascript
weui中的picker使用js进行动态绑定数据问题
Nov 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程序效率优化的一些策略小结
2010/07/17 PHP
解析PHP的session过期设置
2013/06/29 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
用Webpack构建Vue项目的实践
2017/11/07 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python二分查找详解
2015/09/13 Python
Django中url的反向查询的方法
2018/03/14 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
获奖的大学生创业计划书
2014/01/05 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
2014年信用社工作总结
2014/11/25 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
如何在C++中调用Python
2021/05/21 Python
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL