手写new
new 的作用:
- 首先创立了一个新的空对象
- 设置原型,将对象的原型设置为函数的 prototype 对象。
- 让函数的 this 指向这个对象,执行构造函数的代码(为这个新对象增加属性)
- 判断函数的返回值类型,如果是值类型,返回创立的对象。如果是援用类型,就返回这个援用类型的对象。
实现:
function myNew() { // 1.创立空对象 let obj = {} let constructor = [...arguments][0] let params = [...arguments].slice(1) // 2.空对象的原型指向构造函数的原型 obj.__proto__ = constructor.prototype // 3.执行构造函数的代码 var ret = constructor.apply(obj, params) // 4.判断返回值类型: // 如果是根本值类型,则返回的创立的'空对象' // 如果是援用类型,则返回这个援用类型的对象 var flag = ret && ret instanceof Object return flag ? ret : obj}// testfunction A(name) { this.name = name}var a1 = myNew(A, 'Lee')var a2 = new A('Lee')console.log(a1, a2)
手写Ajax
AJAX 包含以下几个步骤
- 创立 XMLHttpRequest 对象,也就是创立一个异步调用对象
- 创立一个新的 HTTP 申请,并指定该 HTTP 申请的办法、URL 及验证信息
- 设置响应 HTTP 申请状态变动的函数
- 发送 HTTP 申请
- 获取异步调用返回的数据
- 应用 JavaScript 和 DOM 实现部分刷新
个别实现:
const SERVER_URL = '/server'let xhr = new XMLHttpRequest()// 创立 Http 申请 第三个参数为async,指定申请是否为异步形式,默认为 true。xhr.open('GET', SERVER_URL, true)// 设置申请头信息xhr.responseType = 'json'xhr.setRequestHeader('Accept', 'application/json')// 设置状态监听函数xhr.onreadystatechange = function () { if (this.readyState !== 4) return // 当申请胜利时 if (this.status === 200) { handle(this.responseText) } else { console.error(this.statusText) }}// 设置申请失败时的监听函数xhr.onerror = function () { console.error(this.statusText)}// 发送 Http 申请xhr.send(null)
promise 封装实现:
function getJSON(url) { // 返回一个 promise 对象 return new Promise(function (resolve, reject) { let xhr = new XMLHttpRequest() // 新建一个 http 申请, 第三个参数为async,指定申请是否为异步形式,默认为 true。 xhr.open('GET', url, true) // 设置状态的监听函数 xhr.onreadystatechange = function () { /*0: 申请未初始化 1: 服务器连贯已建设 2: 申请已接管 3: 申请解决中 4: 申请已实现,且响应已就绪*/ if (this.readyState !== 4) return // 当申请胜利或失败时,扭转 promise 的状态 /*200: "OK" 404: 未找到页面*/ if (this.status === 200) { resolve(this.responseText) } else { reject(new Error(this.statusText)) } } // 设置响应的数据类型 xhr.responseType = 'json' // 设置申请头信息 xhr.setRequestHeader('Accept', 'application/json') // 发送 http 申请 xhr.send(null) })}