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的封装
- 用class{}包裹之前的构造函数和原型对象方法
-
构造函数名提升为整个class的类型名,不仅仅只属于构造函数,今后所有的构造函数必须更名为constructor,构造函数中的内容和旧的js写法一致
-
从此class中的原型对象方法,无需再添加类型名.prototype 前缀 以及“ =function ” 也可以省略。凡是放在class中的方法,默认都是放在原型对象里的
-
class内的构造函数和多个原型对象方法之间不用加 , 或 ; 分隔
-
class的使用和旧js中构造函数和原型对象方法的使用完全一样。存储结构完全一样的。——class其实就是"新瓶装旧酒"
访问器属性
- 对于旧的构造函数,在构造函数妈妈肚子里就要保护将来要出生的子对象,其实就是保护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)
- 在class中保护将来的子对象的写法同普通构造函数时的保护方式一样。只不过访问器属性可以简写
get 访问器属性名(){
return this.受保护的其他属性
}
set 访问器属性名(value){
if(条件){
this.受保护的属性=value
}else{
报错
}
}
class的继承
两种类型建间有相同的属性结构和方法定义
使用继承
-
创建一个父类型,父类型构造函数中,保存多个子类型相同部分的属性结构定义,父类型class中,保存多个子类型相同部分的方法定义
-
创建子类型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命令中可以使用单行注释(#...)和多行注释(/*… */),注释的内容不会被服务器执行
评论