20200917冯佳丽

学习日志

静态方法

什么是静态方法?

不需要创建子对象,就可用构造函数直接调用的方法,其实就是将全局函数,找到地方保存而已

什么时候使用静态方法?

只要一个函数不限制调用它的对象的数据类型,任何类型的对象都能使用这个函数,就要用静态方法

使用静态方法

  1. ###### 定义一个函数,判断任意一个对象是不是数组

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语法规则
  1. JSON数据的基本格式:“名:值” 对

​ “name”:"leilei"

  1. 多个数据之间使用逗号分隔

​ "name":"leilei","sex":"woman"

  1. JSON字符串可以描述一个对象,使用花括号保存对象
  “sport”:{
  "ball":true,
  "walk":false
}
  1. JSON字符串还可以描述一个数组,使用方括号保存数组

​ "hobby":["ball","football","run"]

JSON文档与对象的转换

JSON.parse(string/json) 反序列化操作,解析JSON字符串得到JavaScript对象

JSON.stringify(object) 序列化操作,将JavaScript对象转换为JSON字符串

对象的保护

  1. #### 为什么使用对象的保护?

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步)

  1. 将实际存储属性值的受保护的属性隐姓埋名并且半隐藏(定义一个隐藏的数据属性实际存储属性值)

    Object.defineProperty(对象,”_原属性名”,{
    value: 原属性值,
    enumerable:false,
    configurable:false,
    })

  2. 请保镖,保镖要冒名顶替受保护属性的原属性名

案例:

        //请保镖
            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);

学习感受

请保镖的过程有点绕,需要慢慢理解。今天讲的有些多,需要慢慢消化

评论