zoukankan      html  css  js  c++  java
  • Promise

    异步发展流程

        高阶函数解决异步问题

        发布订阅和观察者模式

        Promise核心应用、实现{

            主要核心:解决异步问题

        }

        generator

        async + await

    AOP

    function say(who) {

    console.log(who + " is saying...");

    };

    Function.prototype.before = function() {

    console.log('drinking...');

    this('macro');

    };

    say.before();

    // 简单应用

    Function.prototype.before = function(fn) {

    let _this = this;

    return function(who) {

    fn();

    // console.log(this);

    console.log(who);

    console.log(arguments);

    console.log(...arguments); //es6支持展开运算符,把 arguments依次进行展开

    _this(...arguments);

    // this(); //函数this直接调用是window对象

        }

    };

    let fun = say.before(function() {

    console.log('drinking...');

    });

    fun(['我', '你']);

    结果:

    drinking...

    [ '我', '你' ]

    [Arguments] { '0': [ '我', '你' ] }

    [ '我', '你' ]

    我,你 is saying...

    发布订阅

    let fs = require('fs');

    // 发布订阅:中间代理

    // 发布订阅之间没有关系,中间是通过数组进行关联

    function Events() {

    this.callbacks = [];

    this.results = [];

    }

    //订阅

    Events.prototype.on = function(callback) {

    this.callbacks.push(callback);

    }

    //发布

    Events.prototype.emit = function(data) {

    this.results.push(data);

    this.callbacks.forEach(cb => cb(this.results));

    }

    let e = new Events();

    e.on(function(res) {

    if (res.length === 2) {

    console.log(res);

        }

    });

    //并行操作

    fs.readFile('./callback/发布订阅/b.txt', 'utf8', function(err, data) {

    e.emit(data);

    });

    //注意默认路径问题

    fs.readFile('./callback/发布订阅/a.txt', 'utf8', function(err, data) {

    e.emit(data);

    });

    观察者模式

    //本质是基于观察者模式

    //被观察者:

    class Subject {

    constructor(name) {

    this.name = name;

    this.observers = []; //所有观察者

    this.mood = 'nice';

        };

    //接受观察者

    attach(observer) {

    this.observers.push(observer);

        };

    //

    setMood(mood) {

    this.mood = mood;

    this.observers.forEach(ob => {

    ob.update(mood);

            });

        };

    }

    //观察者

    class Observer {

    constructor(name) {

    this.name = name;

        };

    update(mood) {

    console.log(this.name + " receive:" + mood);

        };

    }

    let sub = new Subject('girl');

    let o1 = new Observer('boy');

    let o2 = new Observer('father');

    // let o3 = new Observer('boy');

    sub.attach(o1);

    sub.attach(o2);

    sub.setMood("bad");





    call() / apply()

    func 函数运行时使用的 this 值。请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 nullundefined 时会自动替换为指向全局对象,原始值会被包装。

    call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组/类数组

    toString方法调用与重写

    var toString = Object.prototype.toString;
    
    toString.call(new Date); // [object Date]
    toString.call(new String); // [object String]
    toString.call(Math); // [object Math]
    
    //Since JavaScript 1.8.5
    toString.call(undefined); // [object Undefined]
    toString.call(null); // [object Null]

    //重写
    function Dog(name,breed,color,sex) {
      this.name = name;
      this.breed = breed;
      this.color = color;
      this.sex = sex;
    }

    Dog.prototype.toString = function dogToString() {
     var ret = "Dog " + this.name + " is a " + this.sex + " " + this.color + " " + this.breed;
     return ret;
    }
    // 模板字符串写法
    Dog.prototype.toString = function dogToString() {
      return `Dog ${this.name} is a ${this.sex} ${this.color} ${this.breed}`;
    }
    // 灵活应用

    function isType(obj, type) {

    console.log(Object.prototype.toString.call(obj));

    return Object.prototype.toString.call(obj).includes(type);

    }

    console.log(isType(arr, 'Array'));

    重度灵活:封装使用

    let types = ['String', 'Object', 'Array', 'Null', 'Undefined', 'Boolean', 'Function'];

    let fns = {};

    //返回函数

    function isType1(type) {

    return function(obj) {

    return Object.prototype.toString.call(obj).includes(type);

        }

    }

    types.forEach(type => {

    fns['is' + type] = isType1(type);

    });

    var b = false;

    console.log(fns['isString'](b));

    console.log(fns['isBoolean'](b));

  • 相关阅读:
    [官网]清华大学的开源镜像站点 配置方法
    Android MIFARE NFCA源码解析
    Delphi XE8 TStyleBook的使用
    【FireMonkey】StyleBook使用方法
    Delphi第三方组件安装DCU.PAS.DPK.BPL.ActiveX控件
    M1卡说明及使用proxmark3破解方法
    M1卡修改各区块控制位值和数据
    DICOMDIR
    ZentaoPMS 系统的优先级以及修改
    集成禅道和svn
  • 原文地址:https://www.cnblogs.com/macro-renzhansheng/p/13057725.html
Copyright © 2011-2022 走看看