js第四周笔记

122 阅读3分钟

day02

面向对象/过程

面向过程:开始==>结束:先干什么在干什么
面向对象:对象(属性,方法)

封装/创建/定义

var ibj={
    "属性名":'属性值'
    "方法名":function(){操作}
}
强调:
    1,“”可以不加
    2,访问:对象名.属性名  对象名.方法名()
    3,访问到不存在的属性返回undefind
    4,随时可以添加新属性/新方法
    5,for in 遍历对象,必须写为obj[i]
    6, 在对象的方法里使用自己的属性值,必须写为ythis.属性名
    

对this的理解的补充

   自定义函数中的this==>当前正在创建的对象

自定义构造函数

   1,创建:
       function 类名(name,age){
           this.name=name
           this.age=age
       }
   2,调用
       var obj=new 类名(实参,...)

面试题

  继承:父元素的成员,子对象可以直接使用
  找父对象:1,对象名.__proto__
           2,构造函数名.prototype;//除math,window其他都可以用
   两链一包:作用域链,原型链,闭包
       原型链:每个对象的属性一层一层向上找每个人的父对象形成的链结构,自己没有的方法属性会找父对象找
       设置共有方法:原型对象.方法名=function(){}

判断自由还是共有

   1.obj.hasOwnProperty("属性名");//true是自有,false是共有或者没有
   完整公式
   if(obj.hasOwnProperty("属性名")){
       自有
   }else{
       if("属性名" in obj){
           共有
       }else{
       没有
       }
   }

修改 删除

   obj.属性名=新值
   delete.obj.属性名
   原型.属性名=新值
   delete.原型.属性名
   

为老ie添加index of()

   if(array.prototype.indexof===undefind){
       array.prototype.indexof=functiion(key,starti){
               strti===undefind&&(starti=0);
               for(var i=starti;i<this.length;i++){
                   if(this[i]==key){
                       return i
                   }
               }
               return -1
       }
   }

判断x是不是数组

  1,判断x是不是继承自Array.prototype
       Array.prototype.isprototype(x)
   2,x.instanceof Array;//返回true就是数组
   3Array.isArray(x);//返回true就是数组 ,只有数组可以用此方法判断
   4Object.prototype.toString.call(x)
   

自定义继承

  1,两个对象的继承
      子对象.__proto__=父对象
   2,批量继承
       构造函数名.prototype=父对象
       
       

es6==>class

 class 类名 extende 老类{
     constructor(name,age,height){
         super(name,age)
         this.height=height
     }
 }

闭包:希望保护一个反复使用的局部变量

 使用:
     1,两个函数进行嵌套
     2,外层函数创建出受保护的变量
     3,外层函数return出内层函数
     4,内层函数操作受保护的变量
     

防抖节流

  function fdjl(){
      var timer=null
      return function(){
          if(timer!=null){
                  clear Timerout(timer)
          }
          timer=setTimeout()=>{
              操作
          },1000)
      }
  }

保护对象

 1,四大特性
     {
         value:`1001
         writable:true;//控制可否修改
         enumerable:true;//控制可否遍历
         configurable:true;//控制可否删除
     }
     修改 1,Object.defineProperty(对象名,“属性名”,{
          writable:true/false
         enumerable:true/false
         configurable:true/false
     })
         2,Object.defineProperties(对象名.{
             "属性名":{
                 四大特性
             }
             。。。
         })

三个级别

    1,防扩展
        object.preventExtensions(x)
    2,防密封
        object.seal(x)
    3,冻结
        object.freeze(x)

set get

 `object.defindPropeoty(对象名,“属性名”,{
         get:()=>{
             console.log("设置数据")
         }
         set:()=>{
             console.log("获取数据")
         }

对象的深浅拷贝

  1,浅:var obj={"name":"obj1"}
         var obj2=obj
  2,深:
      var obj={"name":"obj1"}
      var obj1={...obj}     
 })
 
    或者
    后端 var jsonTxt=json.stringify(jsonobj)
    
     前端 var josnobj=josn.parse(jsontxt)
          或者 eval("("+jsonTxt+")")

Error

  语法错误:SyntaxError
  引用错误:ReferenceError
  类型错误:TypeError
  范围错误:RangeError
  
  让代码报错也能运行:
  try{可能出错的代码}catch(err){出错后执行的代码}
  但是try性能差,多用分支技术代替

自定义错误:

 throw new Error("自定义错误信息")
 

柯里化函数

  function add(a){
      return function(b){
          return function(c){
              console.log(a+b+c)
          }
      }
  }
  add(a)(b)(c)

匿名函数回调

function(){操作}())