正课:
1. *****ES5
对对象的保护:
对单个属性的保护:
数据属性:
访问器属性:
对对象的保护:
问题: 属性可随时直接用=赋值任何值
属性可随时被访问
可随时添加和删除属性
——不严格!
解决: 对对象提供保护:
如何:
1. 对对象的属性提供保护
将对象的属性分两大类:
1. 命名属性: 可随时通过.属性名方式访问的属性
又分为2类:
1. 数据属性: 实际存储属性值的属性
如何保护: 每个属性都包含四大特性:
{
value: 实际存储属性值,
writable: true/false, //是否可修改
enumerable: true/false,//是否可for in遍历
//依然可用.访问到
configurable: true/false,
//1. 是否可修改前两个特性
//2. 是否可删除当前属性
//一旦改为false,不可逆!
}
特殊: 如果要定义的属性不存在:
defineProperty会自动添加:
自动添加后,属性的特性值都为false
问题: 只能提供基本(只读,遍历,删除)保护
无法按照自定义规则保护属性
解决:
2. 访问器属性: 不实际存储属性值
专门对其它属性提供验证保护
何时: 只要按照自定义规则保护属性
如何: 也有四大特性:
{
get:function(){return 受保护的属性值},
set:function(val){
验证要赋的新值val
验证通过才将val保存到受保护的属性中
},
enumerable:true/false,
configurable:true/false,
}
当通过访问器属性获取受保护的属性值时
自动调用get方法
当通过访问器属性为受保护的属性赋值时
自动调用set方法
参数val,自动获得要赋的新值
大问题: 受保护的属性值应该保存在哪儿?
才能做到比人不能直接用,只能通过访问器属性访问
解决: 闭包!
2. 内部属性: 无法通过.属性名方式访问到的属性
class Object.prototype.toString.call(obj)
__proto__ Object.getPrototypeOf(obj)
Object.setPrototypeOf(child,father)
2. 对整个对象提供保护
正课:
1. *****ES5
对对象的保护:
对属性的保护
防篡改
Object.create();
数组API:
*****bind()
1. 对对象的保护:
对属性:
命名属性:可用.访问到的属性
数据属性:直接存储属性值的属性
访问器属性:不直接存储属性值,专门对其它属性提供保护的特殊属性
大问题: 受保护的属性值应该保存在?
解决: 闭包
内部属性:
防篡改: 禁止修改对象的属性结构
3个级别:
1. 防扩展: 禁止向对象中添加新属性
Object.preventExtensions(obj)
2. 密封: 即防扩展,又禁止删除旧属性
Object.seal(obj)
其实是将所有属性的configurable设置为false
3. 冻结: 即密封,又禁止修改所有属性值!
何时: 如果一个对象中保存了大量不变的属性值时
Object.freeze(obj);
其实是将所有属性的writable设置为false!
2. Object.create():
var newObj=Object.create(father,{扩展的新属性})
创建一个新对象newObj,继承father,并为newObj扩展新的自有属性
何时: 只要继承一个现有对象,创建一个新的子对象时
相当于: var newObj={};
newObj.__proto__=father;
Object.defineProperties(newObj,{
扩展的新属性
})
3. 数组API:
1. 判断: 数组中的元素是否符合要求
1. 所有元素是否都符合要求
var bool=
arr.every(function(val,i,arr){ return 判断条件 }) 2. 是否包含符合要求的元素
var bool=
arr.some(function(val,i,arr){ return 判断条件 })
2. 遍历API: 依次对数组中每个元素执行相同的操作
1. 对原数组中每个元素执行相同的操作,结果保存回原数组
arr.forEach(function(val,i,arr){ arr[i]=新值; });
2. 取出原数组中每个元素的值,执行相同的操作后,保存到一个新数组中
var newArr=arr.map(function(val,i,arr){
return 操作后的元素值
});
3. 过滤和汇总:
过滤: 选择原数组中符合条件的元素,组成新数组
var subArr=arr.filter(function(val,i,arr){
return 判断条件;
});
汇总: 将原数组中每个元素统计出一个汇总结果
var r=arr.reduce(function(prev,val,i,arr){
return prev+val;
},0);
其中: 0: 表示初始值
prev: 截止到目前的阶段汇总值
回调函数的返回值,自动作为下次的prev值