Proxy语法介绍
1 | /* */ |
在Proxy的构造函数中有两个参数
target
要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。handler
一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为。
使用代理控制函数
1 | function sum(a,b){ |
使用代理控制数组
1 | let lesson = [ |
1 | /* */ |
在Proxy的构造函数中有两个参数
target
要使用 Proxy 包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
handler
一个通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为。
1 | function sum(a,b){ |
1 | let lesson = [ |
1 | /* 滑屏相关 */ |
将imgIndex抽象成图片的索引,发现判断左滑右划不方便,决定升级index,抽象成ul的实时位置
1 | /* 滑屏相关 */ |
我们知道当一个对象a赋值给另一个对象b的时候,是把a地址赋值,我们之后操作修改b的时候也会更改a中的内容。我们不希望这种情况发生,所以就想要给b新开辟一个内存,再把a中的内容复制。
1 | /* 方式一:循环 */ |
1 | /* 方式二:Object.assign */ |
1 | /* 方式三:展开语法 */ |
1 |
|
1 |
|
能不能对对象的属性设置一些特征:例如不可枚举,只读等特征
1 | let obj = { name:'liqianru',lesson:'js' }; |
1 | /* defineProperty可以为对象新增属性并设置其特征(默认值为false),也可以对现有属性修改其特征 。还可以为属性设置访问器*/ |
1 | Object.preventExtensions(obj); |
封闭对象:使对象不可添加属性,不可删除,不可修改属性特征,当前属性的值只要原来是可写的就可以改变。当对象需要被保护的时候可用
1 |
|
封闭对象:冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。
1 | Object.freeze(obj); |
使用场景:当我设置了对象user,里面的属性的值可以被随意更改,对数据的质量没有把关。访问器就起到了把关的作用
1 | /* 初识 */ |
1 | let user={ |
1 | let lesson = { |
1 | let user = { |
Auth0中的解释:TOKEN分为两类: ID tokens and access tokens.
ID tokens:用于身份验证
access tokens:拥有这个令牌可以获取到API的使用权
所以就需要存储这些TOKEN,就可以使用访问器
1 |
|
1 | function User(name,age){ |
1 | class User{ |
1 |
|
比如说我想实现一个函数,在我没有传递参数的时候,函数运行时使用默认值,传递参数后,覆盖默认值
1 | function f1(options = {}){//注意:此处一定要初始化形参为为空对象否则 f1不传递参数时会报错:TypeError: Cannot read property 'width' of undefined |
1 | let a ={a:1}; |
1 | //增加 |
1 | obj.hasOwnProperty('age');//判断当前对象上(不涉及原型链)有没有属性 |
1 | let obj = { |
1 | let ary = [1, 2, 3, 4]; |
1 | let ary = [1, 2, 3, 4, 5]; |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ary.indexOf(2);//寻找2的下标值
//return 1
ary.indexOf(88);//寻找 88 的下标值,找不到返回-1
// -1
let a=[1,1,1,2];
a.lastIndexOf(1);//返回下标值2,也就是说查找值为一的最后出现的下标
ary.lastIndexOf(3,-4);//与 indexOf 正好相反
//-1
ary.lastIndexOf(3,0);//与 indexOf 正好相反
//-1
ary.lastIndexOf(3,2);//与 indexOf 正好相反
//2
1 | 方式一:if(ary.indexOf(2)!=-1)//有 |
问题:当我们想要查找数组中是否存在一个引用类型时,用 includes 行吗?:NO
1 | let a = [{ name: "w" }, { name: "s" }]; |
那么如何检索引用类型?
1 | let a = [{ name: "w" }, { name: "s" }]; |
1 | function Myfind (callback){ for(let i of ary){if(callback(i)) return i;}//return undefined; |
1 | let a = [{name:'aa'},{name:2}] |
some() 方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值
1 |
|
1 | let a = [10,12,11]; |
1 | let a = [10,12,11]; |
1 | /* map映射数组:数组中的元素如果是值类型,则不会被影响;若是引用类型则会被影响 */ |
1 | let a = [1,2,3,4,5]; |
1 | class User{ |
构造函数
1 | class User{ |
1 | /* 类的声明 */ |
1 | /* 函数的声明 */ |
可以发现class和function的原型都是function,也就是说class底层的机制仍然是原型机制,可以说类就是函数。class 只是语法糖为了让类的声明与继承更加简洁清晰。
1 | class User{ |
user:
1 | class User{ |
1 | function H(){ |
1 |
静态属性即为类设置属性,而不是为生成的对象设置,在 class 中为属性添加 static 关键字即声明为静态属性
1 | /* 可以把为所有对象使用的值定义为静态属性 */ |
我使用的是VPN,所以就有一个代理服务器
1 | git config --global http.proxy 代理地址:端口号 |
当元素或者选择的文本被拖动时触发 drag 事件,并且在拖拽未结束之前每隔几百毫秒触发一次drag事件
dragstart:用户开始拖拉时,在被拖拉的节点上触发,该事件的target属性是被拖拉的节点。通常应该在这个事件的监听函数中,指定拖拉的数据。
dragend:拖拉结束时(释放鼠标键或按下 ESC 键)在被拖拉的节点上触发,该事件的target属性是被拖拉的节点。它与dragstart事件,在同一个节点上触发。不管拖拉是否跨窗口,或者中途被取消,dragend事件总是会触发的。
dragenter:拖拉进入当前节点时,在当前节点上触发一次,该事件的target属性是当前节点。通常应该在这个事件的监听函数中,指定是否允许在当前节点放下(drop)拖拉的数据。如果当前节点没有该事件的监听函数,或者监听函数不执行任何操作,就意味着不允许在当前节点放下数据。在视觉上显示拖拉进入当前节点,也是在这个事件的监听函数中设置。
dragover:拖拉到当前节点上方时,在当前节点上持续触发(相隔几百毫秒),该事件的target属性是当前节点。该事件与dragenter事件的区别是,dragenter事件在进入该节点时触发,然后只要没有离开这个节点,dragover事件会持续触发。
dragleave:拖拉操作离开当前节点范围时,在当前节点上触发,该事件的target属性是当前节点。如果要在视觉上显示拖拉离开操作当前节点,就在这个事件的监听函数中设置。
用于表示拖、放交互的DOM event接口
dataTransfer(只读) :保存着拖拽操作中的数据,dataTransfer的对象(其中保存着数据)
dataTransfer中包含的属性
dropEffect:表示拖放过程中给用户的反馈,会影响拖拽过程中鼠标光标的手势,似如hover的鼠标手势变化
值:
none(默认):可能禁止拖拽(说可能是因为,还与effectAllow又关)
move:将元素移动到新位置
copy:新位置产生原元素的副本
link:新位置产生原项目的链接
effectAllow:允许dropEffect的行为发生
值
uninitialized(效果没有设置时的默认值<=>all)
none 此项表示不允许放下
copy源项目的复制项可能会出现在新位置。
copyLink允许 copy 或者 link 操作。
copyMove允许 copy 或者 move 操作。
link可以在新地方建立与源的链接。
linkMove允许 link 或者 move 操作。
move一个项目可能被移动到新位置
all允许所有的操作。
setData:[ function ]用于存储拖拽时想要存储的数据
1 | /* @params: |
getData:[function]用于获取存储的数据
1 | dataTransfer.getData('dataName'); |
1 | /* 简单的使用slice截取数组 */ |
1
2
3
4
5
6
let ary = [1,2,3,4,5];
/* 两个参数的含义:从哪个下标开始截取;截取几个元素 */
let newA = ary.splice(0,2);
console.log(ary);//[3,4,5],发现原数组被改变,删除了[1,2]
console.log(newA);//[1,2]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let ary = [1,2,3,4,5];
let ary2 = ['a','b','c','d'];
/* 在头部追加:前两个参数的含义不变,之后的参数为新增的元素内容,从原数组的头部插入(因为第一个参数为0) */
let newA = ary.splice(0,2,'x1','x2','x3');
/* 在插入的同时进行了删除 */
console.log(ary);//["x1", "x2", "x3", 3, 4, 5]
console.log(newA);//[1, 2]
/* 在特定位置追加:在2-3数字之间的位置追加 */
let ary3 = [1,2,3,4,5];
ary3.splice(2,0,'a','b');
console.log(ary3);//[1, 2, "a", "b", 3, 4, 5]
/* 在末尾增加 */
ary3.splice(ary3.length,0,'cc');
console.log(ary3);// [1, 2, "a", "b", 3, 4, 5, "cc"]
/* 替换操作 :把ary2中的b替换为2*/
let newA2 = ary2.splice(1,1,2);
console.log(newA2);//输出被删除的元素["b"]
console.log(ary2);//["a", 2, "c", "d"]
1 | /* 清空数组的几种方式 */ |
传统设置布局后,如果某一天布局改变,如三个平分的块变成四个,能不能不改变css内容响应式布局?答,弹性盒模型
包含着弹性元素的父元素。通过设置 display 属性的值为 flex 或 inline-flex 来定义弹性容器。
弹性容器的每个子元素都称为弹性元素。弹性容器直接包含的文本将被包覆成匿名弹性单元。
1 |
|
初始值:row 是否是继承属性:否
1 | div{ |
1 | div{ |
1 | div{ |
1 |
|
效果排列
1 |
|
伸缩元素向每行中点排列。每行第一个元素到行首的距离将与每行最后一个元素到行尾的距离相同。
1 |
|
在每行上均匀分配弹性元素。相邻元素间距离相同。每行第一个元素与行首对齐(无间距),每行最后一个元素与行尾对齐(无间距)。
1 |
|
1 |
|
元素在侧轴居中。如果元素在侧轴上的高度高于其容器,那么在两个方向上溢出距离相同。
在弹性元素没有设置高度或宽度(若设置了高宽度则以设置的为准)的时候,弹性元素沿着交叉轴的方向延伸
要注意的是多行交叉轴的起始位置
1 | #c{ |
效果显示:
normal
这个关键字的效果取决于我们处在什么布局模式中:
flex-start
元素向侧轴起点对齐。
元素向侧轴终点对齐。
flex-grow:n; 把剩余空间平均分配成n等份
1 | /* 给弹性盒中的每一个弹性元素设置 */ |
1 | flex-grow:0; |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true