保护对象、对象的深浅拷贝、Error对象、柯里化函数

68 阅读3分钟

保护对象

  • 保护对象的属性和方法
  • 保护对象不重要
    • 如果你不用面向对象开发,那你也没有对象可保护
    • 前辈们都没保护
    • 别人一般来说不可能知道你取的对象名字叫什么

四大特性

  • value: 1001, //实际保存值的地方
  • writable: true, //开关:控制着是否可以被修改 - 默认值:都为true
  • enumerable: true, //开关:控制着是否可以被for in循环遍历到 - 默认值:都为true
  • configurable: true //开关:控制着是否可以被删除 - 默认值:都为true,总开关:一旦设置为false,其他特性不可以再修改,而且它本身也是一旦设置为false,不可逆

修改四大特性

  • 调用一次方法只能保护一个属性的四大特性
Object.defineProperty(对象名,"属性名",{
	修改四大特性
})
  • 至少方法只调用了一次
Object.defineProperties(对象名,{
	"属性名":{修改四大特性},
	...
})
  • 四大特性甚至不能防止添加

四大特性,其实应该叫六大特性 - 可以帮助我们做出动态数据

Object.defineProperty(obj,"name",{
	get:()=>{
		console.log("获取数据会进行拦截");	
	},
	set:v=>{
		console.log("设置数据会进行拦截");
		v;//拦截到的新数据
		d1.innerHTML=v;
	}
})
//vue中的所有数据都是动态数据,意味着他的底层就是做了拦截操作	

三个级别

防扩展

  • 防止添加Object.preventExtensions(obj);

密封

  • 防止添加和删除Object.seal(obj);

冻结

  • 防止添加和删除和修改Object.freeze(obj);

对象的深浅拷贝

浅拷贝

var obj1={"name":"obj1"};
var obj2=obj1;

深拷贝

var obj1={"name":"obj1"};
var obj2={...obj1}
  • 如何脱掉后端传来的数据
    • 后端穿衣服:var jsonText=JSON.stringify(obj1);
    • 前端脱衣服:var jsonObj=JSON.parse(jsonText);
    • 此方法也能实现深拷贝

Error对象

  • 快速找到错误
  • 记得要放用户

浏览器自带4种错误类型

  • 语法错误:SyntaxError - 一定是你的符号写错了
  • 引用错误:ReferenceError - 没有创建就去使用了
  • 类型错误:TypeError - 不是你的方法,你却去使用了
  • 范围错误:RangeError - 只有一个API会碰到:num.toFixed(d);//d取值范围:0~100之间

错误处理

  • 就算发生错误,我们也不希望报错,而是给出一个错误提示,让后续代码可以继续执行
try{
	只放入你可能出错的代码
}catch(err){
	发生错误后才会执行的代码
alert(err);//err就是我们的错误提示:只不过是英文的
alert("中文的错误提示,来提示用户");
}
  • try...catch...的性能非常差,几乎是所有代码里最差的,放在try中的代码效率会被降到最低
  • 可以用一个技术代替他:分支结构
  • 只要你做好该做的防护就不会出错(!isNaN、正则)

抛出自定义错误

  • 只要是错误,后续代码都不会执行throw new Error("自定义错误消息");

ES5:严格模式

  • 开启:"use strict"; - 写在任何一个作用域的顶部都可以
  • 作用
    • 禁止了全局污染,使用变量之前必须先创建变量
    • 将静默失败升级为了错误

柯里化函数

function add(a){
	return function(b){
		return function(c){
			console.log(a+b+c);
		}
	}
}
add(3)(5)(7)