// 实现instanceof,用于判断a是否是b的实例,不能用于判断基本类型变量,通常用于检测引用类型变量
// 用于测试一个对象在其原型链上是否存在一个构造函数的prototype属性
// function myInstanceof(left, right) {
// // 获取对象的原型
// let proto = Object.getPrototypeOf(left);
// // 获取构造函数的原型
// let prototype = right.prototype;
// // 判断构造函数的 prototype 对象是否在对象的原型链上
// while(true) {
// if(!proto) {
// return false;
// }
// if(proto === prototype) {
// return true;
// }
// proto = Object.getPrototypeOf(proto);
// }
// }
// 实现call
// Function.prototype.myCall = function(context, ...args) {
// let cxt = context || window;
// let func = Symbol();
// cxt[func] = this;
// args = args ? args : [];
// const res = args.length > 0 ? cxt[func](...args) : cxt[func]();
// delete cxt[func];
// return res;
// }
// Function.prototype.myApply = function(context, args = []) {
// let cxt = context || window;
// let func = Symbol();
// cxt[func] = this;
// const res = args.length > 0 ? cxt[func](...args) : cxt[func]();
// delete cxt[func];
// return res;
// }
// Function.prototype.myBind = function(context, ...args) {
// const fn = this;
// args = args ? args : [];
// return function newFn(...newFnArgs) {
// if(this instanceof newFn) {
// return new fn(...args, ...newFnArgs);
// }
// return fn.apply(context, [...args, ...newFnArgs]);
// }
// }
// let name = '小王',age =17;
// let obj = {
// name:'小张',
// age: this.age,
// myFun: function(from,to){
// console.log(this.name + ' 年龄 ' + this.age+'来自 '+from+'去往'+ to)
// }
// }
// let db = {
// name: '德玛',
// age: 99
// }
// //结果
// obj.myFun.myCall(db,'成都','上海'); // 德玛 年龄 99 来自 成都去往上海
// obj.myFun.myApply(db,['成都','上海']); // 德玛 年龄 99 来自 成都去往上海
// obj.myFun.myBind(db,'成都','上海')(); // 德玛 年龄 99 来自 成都去往上海
// obj.myFun.myBind(db,['成都','上海'])();
// const log = (callback) => {
// log.count = log.count || 0;
// var count = log.count++;
// setTimeout(()=>{
// console.log(count);
// callback && callback();
// }, Math.random()*1000%10);
// }
// log()
// log()
// localStorage 设置过期时间
// var date = new Date().getTime();
// // 设置值
// newLocalStorage.set('test', 'hello', date + 10000);
// // 获取localStorage的值
// newLocalStorage.get('test');
// const newLocalStorage = {
// set: function(key, value, ttl_ms) {
// var data = {value: value, expires: new Date(ttl_ms).getTime()};
// localStorage.setItem(key, JSON.stringify(data));
// },
// get: function(key) {
// var data = JSON.parse(localStorage.getItem(key));
// if(data !== null) {
// if(data.expires !== null && data.expires < new Date().getTime()) {
// localStorage.removeItem(key);
// }
// else {
// return data.value;
// }
// }
// return null;
// }
// }
// 定义三个常量表示三种状态
// const PENDING = 'pending';
// const FULFILLED = 'fulfilled';
// const REJECTED = 'rejected';
// class myPromise {
// constructor(executor) {
// // executor 是一个执行器,会立即执行
// executor(this.resolve, this.reject);
// }
// // 存储状态的变量,初始值为 pending
// status = PENDING;
// // resolve和reject为什么要用箭头函数?
// // 如果直接调用的话,普通函数this指向的是window或者undefined
// // 用箭头函数就可以让this指向当前实例对象
// // 成功之后的值
// value = null;
// // 失败之后的值
// reason = null;
// // 存储成功时候的回调函数
// onFulfillCallback = null;
// // 存储失败的回调函数
// onRejectedCallback = null;
// // 更改成功之后的状态
// resolve = (value) => {
// // 只有状态是等待的,才能进行状态修改
// if(this.status === PENDING) {
// // 把状态修改为成功
// this.status = FULLFILLED;
// // 保存成功之后的值
// this.value = value;
// // 判断成功的回调是否存在,如果存在就调用
// this.onFulfillCallback && this.onFulfillCallback(value);
// }
// }
// // 更改失败之后的状态
// reject = (reason) => {
// // 只有状态是等待,才能更改状态
// if(this.status === PENDING) {
// // 把状态改为失败
// this.status = REJECTED;
// // 保存失败原因
// this.reason = reason;
// // 判断失败的回调是否存在,如果存在就调用
// this.onRejectedCallback && this.onRejectedCallback(reason);
// }
// }
// then(onFulfilled, onRejected) {
// // 判断状态
// if(this.status === FULFILLED) {
// // 调用成功回调,并把值返回
// onFulfilled(this.value);
// }
// else if(this.status === REJECTED) {
// // 调用失败回调,并把原因返回
// onRejected(this.reason);
// }
// else if(this.status === PENDING) {
// // 因为后面的状态变化如何,所以将成功回调和失败回调存储起来
// // 等到执行成功失败函数的时候再传递
// this.onFulfillCallback = onFulfilled;
// this.onRejectedCallback = onRejected;
// }
// }
// }
// const promise = new MyPromise((resolve, reject) => {
// resolve('success')
// reject('err')
// })
// promise.then(value => {
// console.log('resolve', value)
// }, reason => {
// console.log('reject', reason)
// })
// ajax 请求数据的过程
function ajaxGet(url, params, success, fail) {
// 1、创建连接
let xhr = null;
xhr = new XMLHttpRequest();
// 2、连接服务器
xhr.open('get', url + encodeParams(params), true);
// 3、发送请求
xhr.send(null);
// 4、接收请求
xhr.onreadystatechange = function() {
// 请求结束,服务器返回数据
if(xhr.readyState === 4) {
// 服务器回应的http状态码 status
if((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
// 从服务器接收到的字符串
success(xhr.responseText);
}
else {
fail && fail(xhr.status);
}
}
}
function encodeParams(obj) {
return Object.keys(obj).map(key => {
return encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])
}).join('&');
}
}
function ajaxPost(url, params, success, fail) {
// 1、创建连接
let xhr = null;
xhr = new XMLHttpRequest();
// 2、接收请求
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
if((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
success(xhr.responseText);
}
else {
fail && fail(xhr.status);
}
}
}
// 3、连接服务器
xhr.open('post', url, true);
// 4、发送请求
xhr.send(JSON.stringify(params));
}
console