保护对象:保护对象的属性和方法
每个属性都有四大特性:
{
value: '', //实际保存值的地方
writable: true, //开关,控制着这个属性是否可以被修改 - 默认值为true
enumerable: true, //开关,控制着这个属性是否可以被for in循环遍历到 - 默认值为true
configurable: true //开关,控制着这个属性是否可以被删除 - 默认值为true,总开关:一旦设置为法拉瑟,其他特性不可以在修改,而且他本身也是一旦设置为false,不可逆
}
修改四大特性:
1、
Object.defineProperty(对象名,"属性名",{
四大特性
})
调用一次方法只能保护一个属性的四大特性
2、
Object.defineProperties(对象名,{
"属性名":{四大特性},
...
})
至少方法只调用了一次,但是四大特性写着始终麻烦,甚至不能防止添加
2、三个级别:
//1、防扩展:防添加
Object.preventExtensions(obj);
//2、密封:防添加防删除
Object.seal(obj);
//3、冻结:防添加防删除防修改
Object.freeze(obj);
四大特性,其实应该叫六大特性 - 可以帮助我们做出动态数据,以后不会手动使用,只是明白Vue底层就是用到了set拦截操作
Object.defineProperty(lhl,"name",{
get:()=>{
console.log("获取数据会进行拦截操作");
},
set:v=>{
console.log("设置数据会进行拦截操作"+v);//v拦截到的数据
h1.innerHTML=v;
},
})
对象的深浅拷贝:
1、浅拷贝:利用按值传递
var obj1={"name":"obj1"};
var obj2=obj1;
2、深拷贝:两者互不影响
var obj1={"name":"obj1"};
var obj2={...obj1};
3、以后如何脱掉后传来的数据的衣服:
后端穿衣服:var JSONtxt=JSON.stringify(obj); - Node.js就是这句话,Node.js也是“js”,历史上第一次一门语言可以通吃前后端
前端脱衣服:var jsonObj=JSON.parse(JSONtxt);
此方法也能实现深拷贝
Error对象:错误
浏览器自带4种错误类型:可以快速找到自己的错误
1、语法错误:SyntaxError - 一定是你的符号/语法写错
2、引用错误:ReferenceError - 没有创建就去使用了
3、类型错误:TypeError - 不是你的方法,你却去使用了
4、范围错误:RangeError - 只有一个API会碰到:num.toFixed(d);//d取值范围:0~100之间
只要发生错误,就会报错,会导致后续代码终止(闪退),我们不希望
错误处理:就算发生错误,我们也不希望报错,而是给出一个错误提示,让后续代码依然可以继续执行!
语法:
try{
只放入你可能出错的代码
}catch(err){
发生错误后才会执行的代码
err形参就保存着错误的消息,只不过是英文的,中国人不一定看得懂,所以建议你添加上中文的错误提示
}
try...catch...的性能非常的差,几乎事所有代码里性能最差的,放在try中的代码效率都会被降到最低
*可以用一个技术代替他:分支技术!
*开发经验的累计:记住一切的客户端输入/用户输入都是坏人 - 但是你不担心,只要你做还要防护就不会出错(!isNaN、正则)
抛出自定义错误:只要是错误,后续代码都不会执行
throw new Error("自定义错误消息")
ES5:严格模式
开启:"use strict" - 写在任何一个作用域的顶部都可以
作用:
1、禁止了全局污染,使用变量之前必须先创建变量
2、将静默失败升级为报错
铺垫:以后我们用了gulp技术打包项目后,有的js会自动加上严格模式,我劝你把他删掉
柯里化函数
function add(a){
return function(b){
return function(c){
console.log(a+b+c)
}
}
}
add(3)(5)(7);
匿名函数:没有名字的函数,有两种用法:
1、自调:只能执行一次,好处:函数中的没有用的变量是会自动释放的,它可以用于代替全局代码写法,两者很相似,都只会执行一次,但是自调会释放没用的东西
(function(){
操作;
})();
2、回调:匿名函数不是自调,就是回调,所以回调函数,我们往往只需要学习如何使用即可
elem.on事件名=function(){}
arr.sort(function(){})
xxx.api(function(){})
var obj={
"方法名":function(){}
}
一切的回调函数,都可以简化为箭头函数
设计模式:不仅仅局限于前端,它是一种编程【思想】,越来越复杂,对于我们前端人来要求也会越来越高!
1、单例模式:也称之为单体模式,保证一个类仅有一个实例对象创建,并且提供一个访问它的全局访问点:为了三阶段的Vue做准备:new Vue一个页面只写一次/一个!
现实举例:一个班级只有一个班主任,只有一个太阳,一个国家只有一个主席,"唯一" 便于访问(全局访问的),行为对象变成做单例
如何实现:
最简单的单例模式:利用ES6的let不允许重复声明的特性,刚好就符合了单例的特点:
2、观察者模式:也有人称呼叫做发布订阅模式:为三阶段vue的bus总监用到的底层原理就是我们的发布订阅模式
现实举例:QQ空间,朋友圈,微博...
事件轮询:js其实是单线程应用,代码必须是从上向下执行的,一步一步执行的,如果某一块代码非常耗时,可能会导致整个页面都卡住了,尤其如果你把js放在head之中,会看到页面是一个白板!
1、宏任务:不会再卡住我们的单线程应用,可以让后续代码先走,我们慢慢跟着来,但是问题在于,多个宏任务同时存在,到底谁先执行,谁后执行,分不清楚
1、定时器:setInterval和setTimeout()
2、AJAX:
2、微任务:ES6提供了Promise对象 - 可以控制异步代码,依然是异步代码,但是可以控制执行的顺序了
function ajax1(resolve){
setTimeout(()=>{
console.log(1);
resolve();//放行函数
},Math.random()*5000)
}
function ajax2(){
return new Promise(resolve=>{
setTimeout(()=>{
console.log(2);
resolve();
},Math.random()*5000)
})
}
function ajax3(){
return new Promise(resolve=>{
setTimeout(()=>{
console.log(3);
resolve();
},Math.random()*5000)
})
}
new Promise(ajax1).then(ajax2).then(ajax3);