其实es6的面向对象很多原理和机制还是ES5的,只不过把语法改成类似php和java老牌后端语言中的面向对象语法.

一、用es6封装一个基本的类

         class Person{
constructor( uName ){
this.userName = uName;
}
sayName(){
return this.userName;
}
}

是不是很向php和java中的类, 其实本质还是原型链,我们往下看就知道了

首先说下语法规则:

class Person中的Person就是类名,可以自定义

constructor就是构造函数,这个是关键字,当实例化对象的时候,这个构造函数会被自动调用

         let oP = new Person( 'ghostwu' );
console.log( oP.sayName() ); //ghostwu console.log( oP instanceof Person ); //true
console.log( oP instanceof Object ); //true console.log( typeof Person ); //function
console.log( typeof Person.prototype.sayName ); //function
console.log( oP.__proto__ === Person.prototype ); //true console.log( 'sayName' in oP ); //true
console.log( Person.prototype );

第1行和第2行实例化和调用方法还是跟es5一样

第4行和第5行判断对象是否是类(Person)和Object的实例, 结果跟es5一样, 这个时候,我们肯定会想到Person的本质是否就是一个函数呢

第7行完全验证了我们的想法,类Person本质就是一个函数

第8行可以看到sayName这个函数其实还是加在Person的原型对象上

第9行还是验证了es5的原型链特点:对象的隐式原型指向构造函数的原型对象

第10行验证oP对象通过原型链查找到sayName方法

这种类的语法,被叫做语法糖,本质还是原型链

二、利用基本的类用法,封装一个加法运算

         class Operator{
constructor( n1 = 1, n2 = 2 ){
this.num1 = n1;
this.num2 = n2;
}
add( n1 = 10, n2 = 20 ){
let num1 = n1 || this.num1, num2 = n2 || this.num2;
return num1 + num2;
}
}
var oper = new Operator();
console.log( oper.add( 100, 200 ) );

三、利用基本的类语法,封装经典的选项卡

css代码:

      #tab div {
width: 200px;
height: 200px;
border: 1px solid #000;
display: none;
} #tab div:nth-of-type(1) {
display: block;
} .active {
background: yellow;
}

html代码:

 <div id="tab">
<input type="button" value="点我1" data-target="#div1" class="active">
<input type="button" value="点我2" data-target="#div2">
<input type="button" value="点我3" data-target="#div3">
<input type="button" value="点我4" data-target="#div4">
<div id="div1">1</div>
<div id="div2">2</div>
<div id="div3">3</div>
<div id="div4">4</div>
</div>

javascript代码:

         window.onload = () => {
class Tab {
constructor( context ) {
let cxt = context || document;
this.aInput = cxt.querySelectorAll( "input" );
this.aDiv = cxt.querySelectorAll( "div" );
}
bindEvent(){
let targetId = null;
this.aInput.forEach(( ele, index )=>{
ele.addEventListener( "click", ()=>{
targetId = ele.dataset.target;
this.switchTab( ele, targetId );
});
});
}
switchTab( curBtn, curId ){
let oDiv = document.querySelector( curId );
this.aDiv.forEach(( ele, index )=>{
ele.style.display = 'none';
this.aInput[index].className = '';
});
curBtn.className = 'active';
oDiv.style.display = 'block';
}
}
new Tab( document.querySelector( "#tab" ) ).bindEvent();
}

[js高手之路] es6系列教程 - 新的类语法实战选项卡的更多相关文章

  1. [js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解

    接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...

  2. [js高手之路] es6系列教程 - 对象功能扩展详解

    第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...

  3. [js高手之路] es6系列教程 - 迭代器与生成器详解

    什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...

  4. [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)

    关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...

  5. [js高手之路] es6系列教程 - var, let, const详解

    function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...

  6. [js高手之路] es6系列教程 - new.target属性与es5改造es6的类语法

    es5的构造函数前面如果不用new调用,this指向window,对象的属性就得不到值了,所以以前我们都要在构造函数中通过判断this是否使用了new关键字来确保普通的函数调用方式都能让对象复制到属性 ...

  7. [js高手之路] es6系列教程 - 箭头函数详解

    箭头函数是es6新增的非常有意思的特性,初次写起来,可能会觉得别扭,习惯之后,会发现很精简. 什么是箭头函数? 箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性: 不能通过n ...

  8. [js高手之路] es6系列教程 - 函数的默认参数详解

    在ES6之前,我们一般用短路表达式处理默认参数 function show( a, b ){ var a = a || 10; var b = b || 20; console.log( a, b ) ...

  9. [js高手之路]es6系列教程 - 解构详解

    解构通俗点说,就是通过一种特定格式,快捷的读取对象/数组中的数据的方法, es6之前,我们通过对象名称[键] 读取数据 var User = { 'name' : 'ghostwu', 'age' : ...

随机推荐

  1. 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)

    引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...

  2. CAN通讯的总结

    1.CAN通讯有套国际标准,套协议版本号,种故障状态,种数据帧类型,种总线错误类型. 2.CAN的国际标准有两种ISO11898和ISO11519. 3.CAN2.0协议分为A版和B版两种,A版协议仅 ...

  3. uva 12009 - Avaricious Maryanna(暴力)

    option=com_onlinejudge&Itemid=8&category=516&page=show_problem&problem=3160" ta ...

  4. Spring之AOP实现面向切面编程

    近期在学Java的动态代理和Spring面向切面编程,越来越认为Spring设计的真的是太完美了.于是,想一个最简单的样例来跑一下.但问题多多,显示缺少,Aspectj里面的相应的类.导入Aspect ...

  5. 盘点selenium phantomJS使用的坑

    参考:http://www.jianshu.com/p/9d408e21dc3a   http://www.cnblogs.com/luxiaojun/p/6144748.html 豆瓣应该是ip被封 ...

  6. 【python】函数说明文档

  7. iOS 蓝牙开发资料记录

    一.蓝牙基础认识:   1.iOS蓝牙开发:  iOS蓝牙开发:蓝牙连接和数据读写   iOS蓝牙后台运行  iOS关于app连接已配对设备的问题(ancs协议的锅)          iOS蓝牙空中 ...

  8. 【实验手册】使用Visual Studio Code 开发.NET Core应用程序

    .NET Core with Visual Studio Code 目录 概述... 2 先决条件... 2 练习1: 安装和配置.NET Core以及Visual Studio Code 扩展... ...

  9. Java多线程之赛跑游戏

    在JavaSE中,多线程是一个重要的内容. 我们要了解多线程的概念,就要先了解进程的概念:要了解进程的概念,就离不开操作系统的概念. 在一台正常运行的电脑中,计算机硬件(如CPU.内存.硬盘.网卡.显 ...

  10. 小白的Python之路 day4 生成器并行运算

    一.概述 我们已经明白生成器内部的结构,其实就是通过像函数这样的东西实现的! 多线程和单线程:简单来说多线程就是并行运算,单线程就是串行运算 二.生成器执行原理 第一步:生成一个生成器  第二步:执行 ...