zoukankan      html  css  js  c++  java
  • ES6新增—ES6中的对象、面向对象、面向对象的继承、面向对象和继承的应用

    7.ES6中的对象
    在ES6中,将对象的语法也简洁了
    单体模式的对象:
    以前是用json的方法:
    var person={
    name:'小明',
    age:21,
    showName:function(){
    alert(this.name);
    },
    showAge:function(){
    alert(this.age);
    }
    }
    person.showName();
    person.showAge();

    ES6将其简化了:
    var name='小明';
    var age=16;
    var person={
    name,
    age,
    showName(){
    alert(this.name);
    },
    showAge(){
    alert(this.age);
    }
    }
    person.showName();
    person.showAge();

    -------------------------------------------------------------------------------------

    补充:函数参数给默认值:
    function move(obj,json,options){
    console.log(options)
    }
    move(); //会报错,函数move需要传参,在调用函数时,并没有给函数传实参,就会报错
    解决上面的问题,防止报错,我们可以给函数的参数传默认值
    function move(obj='参数必须要写',json={},options={}){
    console.log(obj);
    console.log(options);
    }
    move(); //这里因为给函数的参数传了默认值,所以就不会报错

    -------------------------------------------------------------------------------------

    8.面向对象:
    1)之前面向对象的方法
    function Person(name,age){ 类,构造函数
    //为对象添加属性
    this.name=name;
    this.age=age;
    }
    //为对象添加方法
    Person.prototype.showName=function(){
    alert(this.name);
    }
    Person.prototype.showAge=function(){
    alert(this.age);
    }
    var p1=new Person('aaa',21);
    p1.showAge(); //21

    2)ES6面向对象的方法:
    类:class
    构造函数:constructor 指生成完实例以后,自己就执行的函数

    //面向对象
    class Person{ //类
    //为对象添加属性
    constructor(name='default',age=0){ //给参数传默认值,防止调用时忘记传实参而报错
    this.name=name;
    this.age=age;
    }
    //为对象添加方法
    showName(){
    alert(this.name);
    }
    showAge(){
    alert(this.age);
    }
    }
    var person1=new Person('小明',12);
    var person2=new Person('小李',51);
    alert(person1.name); //小明
    person1.showAge(); //12
    person2.showName(); //小李
    alert(person1.showAge==person2.showAge); //true
    alert(person1.constructor==Person); //true

    -------------------------------------------------------------------------------

    8.面向对象的继承:
    1)之前面向对象的继承
    function Person(name,age){ //类,构造函数
    //为对象添加属性
    this.name=name;
    this.age=age;
    }
    //为对象添加方法
    Person.prototype.showName=function(){
    alert(this.name);
    }
    Person.prototype.showAge=function(){
    alert(this.age);
    }

    //Work继承Person
    function Work(name,age){
    Person.apply(this,arguments); //子类继承父类的属性
    }
    Work.prototype=new Person(); //子类继承父类的方法
    var p1=new Person('aaa',21);
    var w1=new Work('bbb',54);
    p1.showAge(); //21
    w1.showName(); //bbb

    2)ES6中面向对象的继承
    特点:将继承的语法简化
    //面向对象
    class Person{
    //为对象添加属性
    constructor(name='default',age=0){
    this.name=name;
    this.age=age;
    }
    //为对象添加方法
    showName(){
    alert(this.name);
    }
    showAge(){
    alert(this.age);
    }
    }
    //继承
    class Worker extends Person{ //这里即可实现子类的继承
    //继承之后,添加子类特有的属性
    constructor(name,age,job){
    super(name,age); //使用super()将父类的属性继承过来,同时添加子类自己的新属性。如果不加,这个constructor将会把从父类继承的constructor中的属性和方法覆盖,从而使子类没有继承name,age属性,而报错
    this.job=job;
    }
    //继承之后,添加子类特有的方法
    showJob(){
    alert(this.job);
    }
    }
    var person1=new Person('小明',12);
    var person2=new Person('小李',51);
    var woker=new Worker('子类',32,'WEB工程师');
    alert(person1.name);
    person1.showAge();
    person2.showName();
    alert(person1.showAge==person2.showAge); //true
    woker.showName(); //子类
    woker.showAge();
    woker.showJob();

    --------------------------------------------------------------------------------------------------------------

    面向对象和继承的小应用:
    1)队列的增加与删除
    class Queue{
    constructor(content){
    this._queue=[...content];
    }
    shift(){
    return this._queue.shift();
    }
    push(value){
    this._queue.push(value);
    return this._queue.length;
    }
    }
    var q1=new Queue([1,2,3,4]);
    var q2=new Queue([5,6,7,8]);
    q1.shift();
    q2.push(9);
    console.log(q1._queue);
    console.log(q2._queue);

    2)ES6制作选项卡并实现继承

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4   <meta charset="UTF-8">
     5   <meta name="viewport" content="width=device-width, initial-scale=1.0">
     6   <meta http-equiv="X-UA-Compatible" content="ie=edge">
     7   <title>选项卡</title>
     8   <style>
     9     .btn{
    10       background: red;
    11       color: #fff;
    12     }
    13     .box div{
    14        100px;
    15       height: 100px;
    16       border: solid 1px #000;
    17       display: none;
    18     }
    19   </style>
    20 </head>
    21 <body>
    22   <!-- 选项卡 -->
    23   <div id="box" class="box">
    24     <input type="button" value="选项卡1" class="btn">
    25     <input type="button" value="选项卡2">
    26     <input type="button" value="选项卡3">
    27     <div style="display:block;">1111</div>
    28     <div>2222</div>
    29     <div>3333</div>
    30   </div>
    31 
    32   <!-- 定时选项卡 -->
    33   <div id="box2" class="box">
    34     <input type="button" value="选项卡1" class="btn">
    35     <input type="button" value="选项卡2">
    36     <input type="button" value="选项卡3">
    37     <div style="display:block;">1111</div>
    38     <div>2222</div>
    39     <div>3333</div>
    40   </div>
    41 
    42 
    43   <script type="text/javascript">
    44     //选项卡
    45     class Tab{  //
    46       constructor(id){  //constructor在new出来一个实例时就自动执行
    47         this.oBox=document.getElementById(id);
    48         this.aBtn=this.oBox.getElementsByTagName('input');
    49         this.aDiv=this.oBox.getElementsByTagName('div');
    50         this.iNow=0;
    51         this.init();
    52       }
    53       init(){    //为对象添加方法
    54         for (let i = 0; i < this.aBtn.length; i++) {
    55           this.aBtn[i].onclick=function(){
    56             this.hide();    //先循环让所有的都隐藏
    57             this.show(i);    //再让选择的第i个显示出来
    58           }.bind(this);    //bind(this)进行校正this的值
    59         }
    60       }
    61       hide(){
    62         for (let i = 0; i < this.aBtn.length; i++) {
    63           this.aBtn[i].className='';
    64           this.aDiv[i].style.display='none';
    65         }
    66       }
    67       show(index){
    68         this.aBtn[index].className='btn';
    69         this.aDiv[index].style.display='block';
    70       }
    71     }
    72 
    73     //定时选项卡,部分继承上面的选项卡
    74     class AutoTab extends Tab{
    75       constructor(id){
    76         super(id);  //继承,防止覆盖
    77         setInterval(this.next.bind(this),1000);
    78       }
    79       next(){
    80         this.iNow++;
    81         if (this.iNow==this.aBtn.length) {
    82           this.iNow=0;
    83         }
    84         this.hide();
    85         this.show(this.iNow);
    86       }
    87     }
    88 
    89     window.onload=function(){
    90       var tb=new Tab('box');
    91       var Atotb=new AutoTab('box2');
    92     };
    93   </script>
    94 </body>
    95 </html>
  • 相关阅读:
    CSS中float与A标签的疑问
    常用的Css命名方式
    div css 盒子模型
    HTML初级教程 表单form
    Redis学习记录(二)
    Redis学习记录(一)
    Java源码——HashMap的源码分析及原理学习记录
    java编程基础——从上往下打印二叉树
    java编程基础——栈压入和弹出序列
    java基础编程——获取栈中的最小元素
  • 原文地址:https://www.cnblogs.com/yufann/p/ES6-note4.html
Copyright © 2011-2022 走看看