es6学习之(代理proxy,模块化,promise)

代理得demo

// 代理是什么呢?
// 比如下面,通过proxy这个中间人来获取对象里的内容,中间人就是代理
// 首先定义一下对象
let user={
  name:"小明",
  age:10
}

// 下面就是使用代理
// 首先 let a = new Proxy(obj,{}) obj代表代理得目标对象
// 后面得对象代表得是使用get方法和set来获得值和设置值
let a = new Proxy(user,{

// get方法里面第一个参数传代理目标对象target也就是上面的user,第二个代表user里面的属性name,age
  get(target,attr){
    console.log(target); // user
    console.log(attr); // age,因为下面调用a的时候,使用的是age属性
	
	// return里面的内容就是如下面a.age的时候 产生的东西
	// 就是a.age = target[attr]?target[attr]:null
    return target[attr]?target[attr]:null
  },
  // set方法里面第一个参数传代理目标对象target,第二个代表属性,第三个代表设置得值
  set(target,attr,value){
    target[attr] = value
  }
})

let age = a.age

再如

const obj = {
  a: 10
}
let handler = {
    get: function(target, name){
        console.log('test: ', target, name)
        // test:  {"a":10} a
        // test:  {"a":10} b
        return name in target ? target[name] : 37
    }
}
let p = new Proxy(obj, handler)
console.log(p.a, p.b) // 10 37

那么使用代理得好处就是在进行获取值和设置值得时候,就可以做限制
使用代理写类似jsx语法


var DOM = new Proxy({},{
  get(target,attr){
    var dom = document.createElement(attr)
    return function (attrs,...children){
      for ( i in attrs) {
        dom.setAttribute(i,attrs[i])  // 把属性添加到标签里
      }
      for (let i = 0; i < children.length; i++) {
       if (typeof children[i] == 'string') {
          children[i] = document.createTextNode(children[i])
        } 
        dom.appendChild(children[i])
      }
      return dom
    }

  }
})
// DOM.div后拿到的就是那个返回的函数
var d = DOM.div({id:"aa"},"你好","嗯嗯")
document.body.appendChild(d)
var u = DOM.ul({id:"bb"},DOM.li({"class":"li"})) // 还可以在代理对象里调用代理对象方法,类似jsx
document.body.appendChild(u)

模块化

补充导入导出,html文件中使用模块化

// 导入
<body>
<script src="./index.js" type="module"  charset="utf-8"> </script>
<script type="module">
    import {b} from "./index.js"
    console.log(b);
  </script> 
</body>
// 导出
let b={b:20};
export {b};

promise派生

// 通过继承来写自己得promise
class aa extends Promise{     
  success(resolve,reject){      // 其实就是传一个 success 方法来加强then方法
    this.then(resolve,reject)
  }
  fail(reject){
    this.catch(resolve,reject)
  }
}

var aaa = new aa(function (resolve,reject) {
  if (true) {
    resolve("我是对的")
  } else {
    reject("错误")
  }
})
aaa.success(function (res){   // 调用success就相当于调用then
  console.log(res);
})
console.log(aaa);

简单实现promise

实现promise原理:
其实就是首先定义两个数组,这两个数组的作用分别就是存放执行then的回调函数和catch的回调函数。再使用then方法的时候,就会把执行then的回调函数和catch的放到数组里面。然后比如执行then方法,那么在resolve方法里,一个个循环把数组里面的函数执行。
上面是promise的执行流程,下面详细解析
首先比如下面代码是使用class写的,当new这个对象的时候,就会执行构造函数,所以在构造函数里面写一个new Promise成功之后的回调函数,这个回调函数里面写判断什么时候执行resolve(),rejected(),所以这个构造函数里面的回调函数需要传两个函数参数,分别是resolve,rejected
然后再回调函数里,比如判断为true时执行resolve,这里也就是把注册再数组里,为使用promise成功的函数一个个执行出来。所以,new primose的之后,会执行上面这些东西,然后再new 出来的primise对象执行then
然后再new 出来的primise对象执行then,then里面会放一个回调函数,这个回调函数就是放到数组里的,最后被执行的回调函数。
当new promise的时候,会执行构造函数,会执行new promise后的回调函数,回调函数里面的参数是resolve函数,用来执行存放再数组里面的函数,回调函数是判断是执行resolve函数,还是reject,所以传promise里面的resolve和reject
再没有使用then函数时,数组是空的
当使用then方法后,就会执行把函数注册到数组里,然后执行数组里面的函数

class NoPromise{
  constructor(fn){
    this.successList = [];   // 第一步,定义数组
    this.failList = [];
    fn(this.resolveFn.bind(this),this.rejectFn.bind(this))   // 第四步,定义一个回调函数作为判断是执行resolve还是,并且需要绑定当前this(new出来的对象),否则指向window,并且执行resolve
    
  }
  then(successFn,failFn){      // 第二步,把把then里面的函数放到数组里
    console.log("then被执行了");
    
    if (typeof successFn == 'function') { this.successList.push(successFn) }
    if (typeof failFn == 'function') { this.failList.push(failFn) }
  }
  catch( failFn ){
    if (typeof failFn == "function") { this.failList.push(failFn) }
  }
  resolveFn(res){           // 第三步,定义执行数组里的函数的函数
    console.log("resolveFn我被执行了1111111");
    console.log(this.successList);
    
    this.successList.forEach(function (item,index){ 
      console.log("resolveFn我被执行了");
      item(res)
    })
  }
  rejectFn(res){

    this.failList.forEach(function (item,index){ 
      item(res)
   })
  }
}


let fn1 =  function ( resolve, reject){   // 这就是回调函数,用来判断
  console.log("fn被执行啦");
  setTimeout(function (){
    if (true) {
      resolve("成功")    
    }else{
      reject("失败")
    }
  },1000)
}

let p1 = new NoPromise( fn1 )  // 使用第一步,传一个new promise的后的回调函数
console.log(p1);
p1.then(function (res){ console.log(res);})   // 传一个放到数组里的函数,也是then之后的回调就回调的函数
p1.catch(function (res){ console.log(res);}) 
XX区抓住了全球信息化的机遇,不断加大信息化建设投资, 极大地推进了信息化建设和发展。在行政系统内部、社会管理和公共事业领域、产 业发展、社区管理等方面的信息化全面发展,取得了巨大的成就,并使信息产业成 为全区的支柱产业。 五年来,在区委、区政府的领导和重视下,全区形成了“以‘三个代表’重要 思想为指导,全面落实科学发展观,以信息化推动工业化、城市化、现代化,坚持 以规划为指导、以应用为核心、以需求为导向、以服务为宗旨,政府先行,市场主 导,整合资源,加强应用”的信息化发展思路。为建设“和谐XX、效益XX、平安XX” 提供技术保障。 同时,XX区的信息化发展也存在如下方而的问题:第一,缺乏带动全局的“龙 头”应用。虽然在“十五”期间启动了“XX区政府办公信息网”、“XX区综合信息 系统”等一批公共电子政务系统,对带动部门信息技术应用,推进政务信息化发挥 了重要作用。但总体上尚缺乏带动政务全局,并与社会互动的“龙头”应用,如行 政许可并联审批系统、城市安全联动指挥系统等。第二,缺乏关系全局的应用基础 平台。“十五”期间重点建设了网络基础设备,为新时期的发展奠定了重要基础。 但与应用紧密相关的“平台”基础设施,如数据(交换)中心、电子政务平台、电 子商务平台等尚未建成。第三,信息资源开发、共享力度不足。目前,XX信息资源 开发利用的基本特征是以部门内部应用为主,部门间的信息资源开发与共享相当贫 乏。第四,信息化管理力度有待加强,通信管道等信息行业管理缺乏配套的管理手 段,管理力度有待加强。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值