详解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 相关文章推荐
网上抓的一个特效
May 11 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
Nov 22 Javascript
jquery validate 自定义验证方法介绍 日期验证
Feb 27 Javascript
js实现div弹出层的方法
Nov 20 Javascript
详解Bootstrap按钮
Jan 04 Javascript
10个JavaScript中易犯小错误
Feb 14 Javascript
jQuery使用deferreds串行多个ajax请求
Aug 22 Javascript
为你的微信小程序体积瘦身详解
May 20 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
Sep 19 Javascript
JS中验证整数和小数的正则表达式
Oct 08 Javascript
浅析JavaScript异步代码优化
Mar 18 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
Dec 05 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快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
PHP中输出转义JavaScript代码的实现代码
2011/04/22 PHP
分享PHP header函数使用教程
2013/09/05 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
mysqli扩展无法在PHP7下升级问题的解决
2019/09/10 PHP
PHP7修改的函数
2021/03/09 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
2016/11/23 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
Python学习笔记(二)基础语法
2014/06/06 Python
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
Python实现时间序列可视化的方法
2019/08/06 Python
python获取引用对象的个数方式
2019/12/20 Python
PyQt5实现画布小程序
2020/05/30 Python
Python爬取股票信息,并可视化数据的示例
2020/09/26 Python
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
一份软件工程师的面试试题
2016/02/01 面试题
入党积极分子介绍信
2014/01/17 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL