20200917冯佳丽
学习日志
静态方法
什么是静态方法?
不需要创建子对象,就可用构造函数直接调用的方法,其实就是将全局函数,找到地方保存而已
什么时候使用静态方法?
只要一个函数不限制调用它的对象的数据类型,任何类型的对象都能使用这个函数,就要用静态方法
使用静态方法
- ###### 定义一个函数,判断任意一个对象是不是数组
function isArray(obj){
return Object.prototype.toString.call(obj)=="[object Array]";
}
2.为数组添加构造函数
Array.isArray=function(obj){ ... }
3.调用
常见的静态方法
Array.isArray(obj)
判断任意一个对象是否为数组
Object.defineProperties(obj,props)
obj 将要被添加的属性或修改的属性
props 该对象的一个或多个键值对,定义了将要为对象添加或修改的属性
Object.setPrototypeOf(obj,prototype)
obj 将被设置原型的对象
prototype 该对象新的原型(可以是一个对象或者null)
自定义继承
什么是自定义继承?
如果觉得一个对象的整个父对象都不好用,就可以更换这个子对象的父对象
使用自定义继承
1、只修改一个对象的父对象(修改两个对象间的继承关系)
对象.__proto__=新父对象 (不推荐使用)
Object.setPrototypeOf(子对象,新父对象)
案例:
function Xm(name,age){
this.name=name;
this.age=age;
}
function Xl(name,age){
this.name=name;
this.age=age;
}
Xl.prototype.say=function(){
console.log(`我叫${this.name},今年${this.age}岁`)
}
var xiaoming=new Xm('小明',22)
Object.setPrototypeOf(xiaoming,Xl.prototype)
xiaoming.say()
var father=Object.getPrototypeOf(child) 获得子对象的父对象
2、同时修改多个子对象的爹(修改构造函数原型对象,来修改所有子对象的父对象)
构造函数.prototype=father
仅基于现有父对象,创建子对象,并扩展自有属性: Object.create()
语法:
var child=Object.create(father,{
属性名:{
// 四大特性
value:"属性值",
writable:false,
enumerable:true,
configurable:true
},
...
})
注:
value:实际为属性保存的属性值
writable:true/false 控制是否可修改当前属性
enumerable:true/false 控制是否可用for in遍历这个属性
configurable:ture/false (不可逆的,只能修改一次) 是否可删除该属性和是否可修改前两个特性
es5
ES5 是 ECMAScript 的第5个升级版本
JavaScript=ECMAScript(核心语法) + DOM(操作网页) + BOM(操作浏览器窗口)
开起严格模式
整个代码块或js文件启用严格模式
在代码块或js文件的开头插入: "use strict";
仅在一个函数内启用严格模式
在function内,函数体顶部插入: "use strict";
JSON对象
什么是 JSON?
JSON(JavaScript Object Notation),JavaScript对象表示法,以 js 对象的数据格式表示出来的字符串,轻量级的文本数据交换格式。广泛使用于存储和交换文本数据领域,作用与XML类似,但比XML更简洁、更快、更容易解析
JSON语法规则
- JSON数据的基本格式:“名:值” 对
“name”:"leilei"
- 多个数据之间使用逗号分隔
"name":"leilei","sex":"woman"
- JSON字符串可以描述一个对象,使用花括号保存对象
“sport”:{
"ball":true,
"walk":false
}
- JSON字符串还可以描述一个数组,使用方括号保存数组
"hobby":["ball","football","run"]
JSON文档与对象的转换
JSON.parse(string/json) 反序列化操作,解析JSON字符串得到JavaScript对象
JSON.stringify(object) 序列化操作,将JavaScript对象转换为JSON字符串
对象的保护
- #### 为什么使用对象的保护?
JS 中的对象,毫无自保能力,随时可以添加新属性,可以删除现有属性,随时可以修改属性值为任意值
数据属性
获取一个属性的四大特性
var attrs=Object.getOwnPropertyDescriptor(obj,"属性名")
修改一个属性中的特性
① 只修改一个属性的开关(内部隐藏的开关属性,不能通过属性 . 开关方式操作)
Object.defineProperty(对象,"属性名",{
开关 : true/false,
... : ...
})
② 开关,咱们可以关上,别人也可以打开
解决:只要修改前两个开关,都要伴随设置configurable:false。而且configurable:false是不可逆的。一旦改为false,不能再改回true(双保险)
③ 修改多个属性的开关
Object.defineProperties(对象,{
属性名1:{
开关: true/false,
... : ...
},
属性名2:{
... : ...
}
...
})
④ 其实enumerable:false,只是半隐藏。仅防得住for in遍历。防不住“ . ”直接访问
访问器属性
定义访问器属性(2步)
-
将实际存储属性值的受保护的属性隐姓埋名并且半隐藏(定义一个隐藏的数据属性实际存储属性值)
Object.defineProperty(对象,”_原属性名”,{
value: 原属性值,
enumerable:false,
configurable:false,
}) -
请保镖,保镖要冒名顶替受保护属性的原属性名
案例:
//请保镖
var obj={
name:"lili",
sex:"women"
}
Object.defineProperty(obj,"_age",{
value:obj.age,
configerable:true,
writable:true
})
//给age请保镖
Object.defineProperty(obj,"age",{
//保镖请了就是一对儿
//专门负责从受保护的原属性中获取属性值,交给外人
get:function(){
return obj._age
},
//专门负责接受外部的新值,判断是否能修改进原属性中保存
set:function(value){
// value会自动接住外人给的新值
if(value>=18&&value<=60){
obj._age=value
}else{
throw Error("超出年龄限制")
}
},
configurable:false,
enumerable:true,
})
//请求age
obj.age=30
console.log(obj.age)
防篡改(3个级别)
防扩展
设置防扩展
Object.preventExtensions(obj)
判断是否已禁止扩展
Object.isExtensible(obj)
密封
密封对象
Object.seal(obj)
判断是否密封
Object.isSealed(obj)
删除对象
Object.isSealed(obj)
冻结
冻结对象
Object.freeze(obj)
判断是否冻结
Object.isFrozen(obj);
学习感受
请保镖的过程有点绕,需要慢慢理解。今天讲的有些多,需要慢慢消化
评论