20200922冯佳丽

学习日志

解构

概念:

将一个大的对象或数组中集中存储的成员中的个别成员,取出来单独使用

为什么要使用解构?

将来从服务器端返回的对象或数组可能很复杂

使用解构(3种情况)

数组解构

var [变量1, 变量2,...]=数组
下标:0 1

对象解构

var{ 属性名1 : 变量1 , 属性名2 : 变量2 ,...}=对象;

简写形式:如果属性名和变量名相同,只写一个即可

var {属性名1, 属性名2,…}=对象

var {sname:sname, signin:signin}=lilei

=> var {sname, signin}=lilei

参数解构

将所有的参数都定义在一个对象结构中,再传参,调用函数传参时,也是将所有实参值都放在一个对象中传入

使用参数解构(2步)

1、在定义函数时,将所有形参放在一个对象结构中

function 函数名({
属性名1 : 形参1,
属性名2 : 形参2,
...
}){...}

2、在调用函数时,所有实参也必须放在相同结构的对象中,整体传入

函数名({
属性名1 : 实参1,
属性名2 : 实参2,
...
})

案例:
        //点餐系统
        function order({zhushi="面",xiaochi="蛋糕",yinliao="可乐"}){
            console.log(`
               您点的套餐为:
                  主食:${zhushi}
                  小吃:${xiaochi}
                  饮料:${yinliao}
            `)
        }
        order({})
        
        order({
            xiaochi:"鸡米花",
            yinliao:"雪碧"
        })

class

概念

集中存储一个类型的构造函数和原型对象的程序结构,即简化版的面向对象(封装、继承、多态)

为什么使用

因为旧的js中,要定义一个类型,构造函数和原型对象方法是要分着写的。不符合封装的要求

如何使用class

class的封装
  1. 用class{}包裹之前的构造函数和原型对象方法
  2. 构造函数名提升为整个class的类型名,不仅仅只属于构造函数,今后所有的构造函数必须更名为constructor,构造函数中的内容和旧的js写法一致

  3. 从此class中的原型对象方法,无需再添加类型名.prototype 前缀 以及“ =function ” 也可以省略。凡是放在class中的方法,默认都是放在原型对象里的

  4. class内的构造函数和多个原型对象方法之间不用加 , 或 ; 分隔

  5. class的使用和旧js中构造函数和原型对象方法的使用完全一样。存储结构完全一样的。——class其实就是"新瓶装旧酒"

访问器属性

  1. 对于旧的构造函数,在构造函数妈妈肚子里就要保护将来要出生的子对象,其实就是保护this,因为构造函数中this指向将来要创建的新子对象。但是,因为访问器属性只提供保护功能,不实际存属性值,且所有孩子的访问器属性的保护逻辑规则都是统一的。所以,访问器属性应该只在原型对象中定义一份即可

案例:

        'use strict'
        function Emp(eid,ename,eage){
            this.eid=eid;
            this.ename=ename;
            this.eage=eage;
            Object.defineProperties(this,{
                eid:{
                    writable:false
                },
                _eage:{
                    value:eage,
                    writable:true,
                    enumerable:false
                }
            })
            Object.seal(this)
        }
        Object.defineProperties(Emp.prototype,{
            //请保镖,冒名顶替
            eage:{
                get(){
                    return this._eage
                },
                set(value){
                    if(value>=18&&value<=60){
                        this._eage=value
                    }else{
                        throw Error('超过限制')
                    }
                }
            }
        })
        var lili = new Emp(1001, 'lili', 25)
        // lili.eid=0;
        // delete lili.ename;
         lili.eage=27;
         console.log(lili)
  1. 在class中保护将来的子对象的写法同普通构造函数时的保护方式一样。只不过访问器属性可以简写

​ get 访问器属性名(){
​ return this.受保护的其他属性
​ }

set 访问器属性名(value){
if(条件){
this.受保护的属性=value
}else{
报错
}
}

class的继承

两种类型建间有相同的属性结构和方法定义

使用继承

  1. 创建一个父类型,父类型构造函数中,保存多个子类型相同部分的属性结构定义,父类型class中,保存多个子类型相同部分的方法定义

  2. 创建子类型class,让子类型继承父类型,子类型class用"extends 父类型",取代 Object.setPrototypeOf(xxx, xxx),让子类型继承父类型。在子类型构造函数中调用父类型构造函数,两个构造函数共同创造出将来的子对象——将来的子对象中同时包含父类型和子类型中构造函数的属性定义

案例:使用class和继承实现飞机大战的数据结构
        //飞机大战数据结构
        class Diren{
            constructor(x,y) {
                this.x=x;
                this.y=y;
            }
            fly(){
                console.log(`敌军位于(${this.x},${this.y})的位置`);
            }
        }
        //继承
        //击落敌军得分
        class Score extends Diren{
            constructor(x,y,score) {
                super(x,y)
                //通过super 把x,y的值传递给父对象
                this.score=score;
            }
            show(){
                console.log(`敌军在(${this.x},${this.y})位置被击落,获得${this.score}得分`)
            }
        }
        //继承
        //奖励
        class Award extends Diren{
            constructor(x,y,award) {
                super(x,y)
                this.award=award;
            }
            show(){
                console.log(`敌军在(${this.x},${this.y})位置被击落,获得${this.award}`)
            }
        }
        //敌军所在的位置
        var dijun1=new Diren(100,100)
        dijun1.fly()
        //击落
        var jiluo=new Score(200,200,10)
        jiluo.show()
        //奖励
        var jiangli=new Award(200,400,"大飞机")
        jiangli.show()

数据库

按照一定的形式来组织和、存储数据,目的是为了操作数据的增删改删

SQL语法规范

1、每条SQL命令必须以英文的分号作为结束,一条命令可以跨越多行

2、假如某一条命令出现语法规范,则这条命令以及后边所有的命令不再执行

3、SQL不区分大小写,习惯上数据库关键字用大写,非关键字用小写,项目在上线后,如果关键字小写可能会造成错误

4、SQL命令中可以使用单行注释(#...)和多行注释(/*… */),注释的内容不会被服务器执行

评论