day16 保护对象 ES5&ES6的API

57 阅读4分钟

1、ES5: 1、保护对象:保护对象的成员(属性和方法) 如何保护: 1、四大特性: { "value": 1001,//实际保存值的 "writable": true,//开关:控制着这个属性是否可以被修改 "enumerable": true,//开关:控制着这个属性是否可以被for in循环遍历到 "configurable": true//开关:控制着这个属性是否可以被删除 }

		如何修改四大特性:
			Object.defineProperties(obj,{
				"属性名":{四大特性},
				...
			})

	2、三个级别:
		1、防扩展:禁止给对象添加新属性
			Object.preventExtensions(obj);

		2、密封:禁止给对象添加新属性和删除属性
			Object.seal(obj);

		3、冻结:禁止给对象添加新属性和删除属性和修改属性
			Object.freeze(obj);

		其实保护对象对于我们程序员并没有用处,为什么?
			1、如果你用的是面向过程开发,你保护个屁
			2、别人基本不可能知道我们的对象名叫什么
			3、前辈们都没有保护,你保护个啥

2、*****数组的新的API36个:
	1、判断:21、every - 每一个 - 要求每一个元素都要满足,结果才为true,只要有一个不满足就为false - 类似于&&
			语法:
			var bool=arr.every(function(val,i,arr){//				
				console.log(val);//保存的是当前的值
				console.log(i);//保存的是当前的值的下标
				console.log(arr);//数组本身
				return 条件;
			})

		2、some - 有一些 - 要求每一个元素都要不满足,结果才为false ,只要有一个不满足就为true - 类似于||
			语法:
			var bool=arr.some(function(val,i,arr){			
				return 条件;
			})

	2、遍历:将数组中的每个元素取出来执行相同 或 相似的操作
		1、forEach:直接修改原数组
			语法:
			arr.forEach(function(val,i,arr){			
				直接做操作
			})

		2、map:不修改原数组,返回一个新数组
			var newArr=arr.map(function(val,i,arr){			
				return 操作;
			})

	3、过滤和汇总:
		过滤:筛选出自己想要的,但是不会修改原数组。
			var subArr=arr.filter(function(val,i,arr){			
				return 条件;
			})

		汇总:把数组种的每个元素汇总到一起
			var sum=arr.reduce(function(prev,val,i,arr){			
				return prev+val;
			},基础值)
		
	以上6API,底层都是for循环,对其进行了简化

3Object.create(); - 根据父对象创建子对象,继承已经设置好了
	var 子对象=Object.create(父对象,{
		"属性名":{四大特性},
		...
	});

4、面试题:严格模式 - 很严格
	开启:在你的任何作用域的顶部加上一句话:"use strict";
	功能:1、禁止给未声明的变量赋值 - 解决了全局污染
	           2、将静默失败升级为报错

5、*****call/apply/bind:不是自己的方法也可以使用 - 笔试面试开发都很容易用到:
	call/apply:临时替换了函数中的this - 借用
	语法:函数名.call(借用的对象,实参,...); - 单独传入每一个实参
	          函数名.apply(借用的对象,arr);   - 只能传入一个实参是一个数组,apply其实会悄悄的将数组打散为单个元素
	强调:call/apply,相当于立刻调用函数,立刻执行

	bind:永久替换了函数中的this - 买
		3件事:
		1、创建了一个和原函数功能完全相同的新函数
		2、将新函数中的this永久替换为了指定对象,别人都借不走了
		3、将新函数中的部分参数永久固定
		用法:var 新函数=函数名.bind(指定对象,永久实参,...); - 不会立刻执行的,需要自己调用
		强调:bind绑定的新函数没办法被call/apply借走

	个人更推荐:call/apply - 白嫖
	固定套路:31Math.max/min.apply(Math,arr);
		2Object.prototype.toString.call/apply(arr)==="[object Array]"
		3、***类数组转为普通数组:lis=Array.prototype.slice.call(lis);

ES6:语法较大的变化 1、*模板字符串:可以在字符串中放入变量 - 不需要再做字符串拼接了,实现了一个简单的js环境 语法:我的名字叫${name};

2、*let关键字:尽量以后优先使用let创建变量
	let 变量名=值;
	作用:
		1、禁止声明提前
		2、带来了块级作用域:{}就是一个块级作用域
		3、记录着当前触发事件的元素的下标

3、***箭头函数:简化一切的回调函数
	公式:去掉function,()和{}之间添加=>,如果形参只有一个,省略(),函数体如果只有一句话,省略{},函数体只有一句话并且是returnreturn和{}都省略

4for...of循环:垃圾
	for(var v of arr){
		v;//当前值
	}

	缺点:1、不能修改原数组,只能返回新数组
	           2、不能遍历hash数组,意味着不能遍历对象,只能遍历索引数组

二阶段结束之前,再将5个ES6的新特性教给大家,三阶段必用

作业: 1、摇号功能 2、使用let完成要给选项卡 3、保护对象(四大特性、三个级别)试试 4、六个数组API一定要好好写案例尝试一下 5、call/apply/bind