详解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 相关文章推荐
一个JQuery操作Table的代码分享
Mar 30 Javascript
LABjs、RequireJS、SeaJS的区别
Mar 04 Javascript
使用jquery解析XML的方法
Sep 05 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
Oct 26 Javascript
浅析JavaScript作用域链、执行上下文与闭包
Feb 01 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
May 03 Javascript
jQuery实现背景滑动菜单
Dec 02 Javascript
jQuery实现限制文本框的输入长度
Jan 11 Javascript
JS生成一维码(条形码)功能示例
Jan 19 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
js正则表达式校验指定字符串的方法
Jul 23 Javascript
使用PreloadJS加载图片资源的基础方法详解
Feb 03 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实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
js获取字符串字节数方法小结
2015/06/09 Javascript
javascript实现简单的全选和反选功能
2016/01/05 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
Vue实现路由跳转和嵌套
2017/06/20 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
使用vuex较为优雅的实现一个购物车功能的示例代码
2019/12/09 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
美国家用电器和电子产品商店:Abt
2016/09/06 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
地道战观后感2000字
2015/06/04 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书