1. 程式人生 > >es6學習6:一些新特性的實例練習

es6學習6:一些新特性的實例練習

for gen als text 對象產生 ont 代理模式 content asp

// 先定義一個簡化輸出函數
window.print = function (oper, result) {
    result ? console.log(oper, ‘=>‘, result) : console.log(oper);
}
1.------------------proxy------------------------
 // 設置一個msg用來檢測上次操作是否成功變更
    let msg = {status: 0, content: ‘‘};
    // 設置proxy驗證規則
    var studentValid = {
        get: function
(target, key) { msg.status = 0; if (key in target) { return target[key]; } return ‘無相關記錄‘; }, set: function (target, key, newValue) { msg.status = 0; let oldValue = target[key]; if (!(key in
target)) { msg = ‘無相關屬性..‘; return ‘^_^‘; } if (mm.isEqual(oldValue, newValue)) { msg = ‘名稱相同, 無需更改‘; return ‘^_^‘; } if (key === ‘name‘ && !/[A-Za-z]+/.test(newValue)) {
throw new Error(‘值類型錯誤‘); return ‘^_^‘; } if (key === ‘name‘ && (newValue.length === 1 || newValue.length > 6)) { throw new Error(‘長度設置錯誤..‘); return ‘^_^‘; } if (key === ‘age‘ && (newValue <= 0)) { throw new Error(‘值範圍設置錯誤..‘); return ‘^_^‘; } msg = {status: 1, content: `key: ${key} 更改為${newValue}`}; target[‘up_date‘] = Date(); return target[key] = newValue; }, has(target, key) { if (key === ‘up_date‘) { return false; } return ‘ ‘; }, deleteProperty(target, key) { if (/^_/.test(key)) { msg = {status: 1, content: `刪除了${key}屬性`}; target[‘up_date‘] = Date(); return delete target[key]; } return true; } }; // 代理模式處理數據 let student_1_orgin = {name: ‘avenda‘, age: ‘24‘, up_date: Date(), _deleteProp: ‘test‘}, student_1 = new Proxy(student_1_orgin, studentValid); delete student_1._deleteProp; print(student_1_orgin, msg);
2.------------------class每New一個對象產生一個新的序號------------------------
let authorDefault = {
        name: ‘avenda‘,
        age: 25
    }

    class Father {
        constructor(name = "father") {
            this.data = {
                name: name,
                author: authorDefault
            }
        }
    }

    class Son extends Father {
        constructor(status = 0, msg = ‘‘) {
            super();
            if (!Son.vol) {
                Son.vol = 0
            } // 指定初始版本號為0
            this.data.vol = Son.vol++;   // 對象版本號
            this.data.status = status;
            this.data.msg = msg;
        }

        static creatSonByErrorMsg(msg) {
            return new Son(0, msg).data;
        }

        static creatSonByError() {
            return new Son(0).data;
        }

        static creatSonBySuccess() {
            return new Son(1).data;
        }

        static creatSonBySuccessMsg(msg) {
            return new Son(1, msg).data;
        }
    }

    var son = Son.creatSonBySuccessMsg(‘創建成功‘);
    var son2 = Son.creatSonBySuccessMsg(‘創建成功‘);
    var son3 = Son.creatSonBySuccessMsg(‘創建成功‘);
    print(‘sucson‘, son);
    print(‘vol‘, son3.vol)
3.------------------Promise串行(比較麻煩的方法)------------------------
let [a, b, d] = [true, true, true];
    let promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            if (a) {
                resolve(() => {
                    print(‘promise‘, ‘A‘)
                });
            } else {
                reject(‘A執行錯誤‘);
            }
        }, 1000)

    });
    let promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            if (b) {
                resolve(() => {
                    print(‘promise‘, ‘B‘)
                });
            } else {
                reject(‘B執行錯誤‘);
            }
        }, 1000)
    });
    let promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            if (d) {
                resolve(() => {
                    print(‘promise‘, ‘C‘)
                });
            } else {
                reject(‘C執行錯誤‘);
            }
        }, 1000)
    });
4.------------------Promise串行(比較方便的方法)------------------------
 let [a, b, d] = [true, true, true];
    let promiseA = new Promise((resolve, reject) => {
        setTimeout(() => {
            if (a) {
                resolve(() => {
                    print(‘promise‘, ‘A‘)
                });
            } else {
                reject(‘A執行錯誤‘);
            }
        }, 1000)

    });
    let promiseB = new Promise((resolve, reject) => {
        setTimeout(() => {
            if (b) {
                resolve(() => {
                    print(‘promise‘, ‘B‘)
                });
            } else {
                reject(‘B執行錯誤‘);
            }
        }, 1000)
    });
    let promiseC = new Promise((resolve, reject) => {
        setTimeout(() => {
            if (d) {
                resolve(() => {
                    print(‘promise‘, ‘C‘)
                });
            } else {
                reject(‘C執行錯誤‘);
            }
        }, 1000)
    });
    

    Promise.all(
        [promiseA,promiseB,promiseC]
    ).then((result)=>{
        // result是對應的promiseA-C的resolve參數
        result.forEach(item=>item())
            print(‘全部執行完成...‘);
    },(msg)=>{
        // 執行到某步錯誤時候對應的reject
        print(msg)
    })
5.------------------模擬叠代器原理寫個對象叠代器代理(讓對象像數組一樣操作, 並像java叠代器一樣叠代)----------------------
function iteratorProxy (target) {
        let _index = 0;
        let keys = Object.keys(target);
        let len = keys.length;
        let loop = false;
        return {
            next() {
                this.indexFilter();
                if (_index < len - 1 && _index >= 0) {
                    return {
                        key: keys[_index],
                        value: target[keys[_index++]],
                        done: false
                    }
                } else {

                    try {
                        return {
                            key: keys[_index],
                            value: target[keys[_index++]],
                            done: true
                        }
                    } finally {
                        if(loop){
                            _index = 0;
                        }
                    }
                }
            },
            pre() {
                this.indexFilter();
                if (_index < len && _index >= 0) {
                    return {
                        key: keys[_index],
                        value: target[keys[_index--]],
                        done: false
                    }
                } else {
                    loop ? _index = len - 1 : ‘‘;
                        return {
                            key: keys[_index],
                            value: target[keys[_index--]],
                            done: true
                        }

                }
            },
            hasNext() {
                return _index < len;
            },
            hasPre() {
                return _index >= 0;
            },
            get(index = _index) {
                this.indexFilter();
                return (index >= 0 && index < len) ? {
                    key: keys[index],
                    value: target[keys[index]]
                } : null;
            },
            getKey(index = _index) {
                this.indexFilter();
                return (index >= 0 && index < len) ? keys[index] : null;
            },
            getValue(index = _index) {
                this.indexFilter();
                return (index >= 0 && index < len) ? target[keys[index]] : null;
            },
            initIndex() {
                _index = 0;
                this.flushProp();
                return this;
            },
            getIndex() {
                return _index;
            },
            delProp(keyIndex = _index) {
                // 刪除Key及對應值
                delete target[keys[keyIndex]];
                this.flushProp();
                return this;
            },
            setProp(obj) {
                Object.assign(target, obj);
                this.flushProp();
                return this;
            },
            getObj() {
                return target;
            },
            setLoop(open=false){
                loop = open;
            },
            flushProp() {
                keys = Object.keys(target);
                len = keys.length;
                if (_index >= len) {
                    _index = len - 1;
                }
                if (_index <= 0) {
                    _index = 0;
                }
                return this;
            },
            indexFilter(){
                if(_index<0){
                    _index =0;
                    return;
                }
                if(_index>=len){
                    _index=len-1;
                }
            }
        }
    }
  // 測試
let obj
= { name: ‘avenda‘, age: ‘245‘, ccc: ‘ccc‘ } let oI = iteratorProxy(obj); oI.setProp({ newName: ‘dog‘ }) // oI.setLoop(true); while(oI.hasNext()){ print(‘next‘,oI.next()) } while (oI.hasPre()) { print(‘pre‘,oI.pre()) } print(oI.getIndex())
6.------------------generator狀態機------------------------
 let draw = function (count) {
        print(`剩余${count}次`)
    }

    let residue = function* (count) {
        while (count>0) {
            count--;
            yield draw(count);
        }
    }
    let start = residue(5);
    let btn = document.createElement(‘button‘);
    btn.id = ‘start‘;
    btn.textContent = "抽獎";
    document.body.appendChild(btn);
    document.getElementById(‘start‘).addEventListener(‘click‘,function () {
        start.next();
    },false)
7.------------------generator長輪詢------------------------
let ajax = function* () {
        yield new Promise((resolve, reject)=>{
            setTimeout(()=>{
                resolve({code:0})
            },200)
        })
    }
    let pull = function () {
        let generator = ajax();
        let step = generator.next();
        step.value.then((d)=>{
            if (d.code===0) {
                setTimeout(()=>{
                    console.log(‘wait‘)
                    pull();
                },1000);
            }else{
                console.log(d);
            }
        });
    }
    // pull()
8.---------------@decorator修飾器-------------------
let readonly = function (target, name, descriptor) {
        descriptor.writable = false;
        return descriptor;
    }
    class Test{
        @readonly
        time(){
            return ‘2017-03-11‘;
        }
    }

    let test = new Test();

    let addName = function (target, name, descr) {
        target.staticProps = ‘hello‘;
    }
    @addName
    class Test2 {
    }
    console.log(Test2.staticProps)
9.---------------class + call-------------------
class A{
        constructor() {
            this.a = ‘我是A的a‘;
        }
    }

    // noinspection JSAnnotator
    function doSth(args){
        console.log(args);
        console.log(this.a)
    }

    let a = new A();
    doSth.call(a,‘我是個小白‘);

es6學習6:一些新特性的實例練習