SOURCE

//call
// Function.prototype.myCall=function(context,...args){
//     if(typeof this !='function'){
//         throw 'naf'
//     }
//     context = typeof context=='object' ?context :window;
//     const fn =Symbol();
//     context[fn] = this;
//     let res = context[fn](...args);
//     delete context.fn;
//     return res;
// }
// function testCall(){
//     console.log(this);
// }
// testCall.myCall()

//apply
// Function.prototype.myapply = function(context,args){
//     if(typeof this!='function'){
//         throw 'naf'
//     }
//     context = typeof context=='object' ? context : window;
//     context.fn = this;
//     let res = context.fn(args);
//     delete context.fn;
//     return res;
// }
// function testapply(){
//     console.log(this);
// }
// testapply.myapply()

//bind
// Function.prototype.mybind=function(context,...args){
//     if(typeof this!='function'){
//         throw 'naf'
//     }
//     context = typeof context=='object' ?context:window;
//     context.fn = this;
//     return function(...newArgs){
//         let res = context.fn(...args,...newArgs);
//         return res;
//     }
// }
//new
// function myNew(func,...args){
//     let obj ={};
//     obj.__proto__=func.prototype;
//     let res = func.call(res,...args)
//     return typeof res=='object' ? res :obj;
// }

//洗牌算法
// function shuffle(arr){
//     for(let i=0;i<arr.length;i++){
//         let index = Math.floor(Math.random()*i);
//         [arr[i],arr[index]]=[arr[index],arr[i]];
//     }
//     return arr
// }
// let arr = Array.from(Array(100), (item, index) => index); 
// shuffle(arr); 
// console.log(arr)

//原型链继承:问题:父级中有例如列表的引用数据类型的话,会影响并共享。
//且也无法向其中传递参数。
// function Person(){
//     this.name = 'person'
// }
// function Son(){
//     this.a='a'
// }
// Son.prototype = new Person();
// Son.prototype.constructor = Son;
// let s1 = new Son();
// console.log(s1)// {"a":"a"}
// console.log(s1.name)//person
// console.log(s1.constructor)//Son

//构造函数继承:实例之间互不影响,且可以传递参数。
//缺点是每次子实例新建时都会调用父构造函数。
// function Person(){
//     this.name = 'person'
// }
// function Son(){
//     Person.call(this);
//     this.a='a'
// }
// let s1 = new Son();
// console.log(s1)

//组合继承
// function Person(){
//     this.name = 'person'
// }
// function Son(){
//     Person.call(this);
//     this.a='a'
// }
// Son.prototype = new Person();
// Son.prototype.constructor = Son;
// let s1 = new Son();
// console.log(s1)

//原型式继承
// function Person(){
//     this.name = 'person'
// }
// function createSon(o){
//     function Son(){
//         this.type='son'
//     }
//     Son.prototype = o;
//     return new Son();
// }
// let s1 = createSon(new Person());
// console.log(s1)

//寄生式继承
// function Person(){
//     this.name='person'
// }
// function createSon(o){
//     let clone = Object.create(o);
//     clone.sayhi = function(){
//         console.log('hi')
//     }
//     return clone;
// }
//节流
// let throttle = function(func,time){
//     let timer;
//     return function(...args){
//         if(!timer){
//             timer = setTimeout(()=>{
//                 func.apply(this,args);
//                 timer = null;
//             },time)
//         }
//     }
// }

// //防抖
let debounce = function(func,time,limit){
    let count=0;
    let timer;
    return function(...args){
        if(count>=limit){
            func.apply(this,args)
        }else{
            if(timer){
                count++;
                timer = null;
            }
            timer = setTimeout(()=>{
                    func.apply(this,args);
                    timer = null;
            },time)
        }
    }
}

//promise实现sleep
// function mysleep(time){
//     return new Promise((resolve,reject)=>{
//         setTimeout(resolve,time);
//     })
// }
// function sayhi(){
//     console.log('hi');
// }
// mysleep(2000).then(()=>{
//     sayhi();
// })

//promise模拟延迟发起请求
function myRequest(time){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log(time,'time')
            Math.random() > 0.5 ? resolve('success') :reject('reject');
        } , time)
    })
}

// myRequest(1000).then(res=>{
//     console.log(res,'dd')
// },err=>{
//     console.log(err,'dd')
// })
// let urls = [2000, 1000, 5000, 4000];
// let urls2 = [1000, 2000, 3000, 4000];
// let urls3 = [4000, 3000, 2000, 1000, 2000, 1000, 5000, 4000, 1000, 0];

// function request(urls){
//     let res = [];
//     // for(let i=0;i<urls.length;i++){
//         // myRequest(urls[i]).then((msg)=>{
//         //     res[i] = msg;
//         // },(err)=>{
//         //     res[i] = err;
//         // })
//         // .finally(()=>{
//         //     for(let i=0;i<urls.length;i++){
//         //         console.log(res[i])
//         //     }
            
//         // })
//         urls.reduce((pre,cur)=>{
//             return myRequest(cur).then((suc)=>{
//                 console.log(suc,'succ')
//             },(err)=>{
//                 console.log(err,'err')
//             })
//         },null)
//     // }
// }
// request(urls)
console 命令行工具 X clear

                    
>
console