SOURCE

// 实现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 命令行工具 X clear

                    
>
console