Информация об изменениях

Сообщение Re: es6 Proxy от 21.01.2017 11:04

Изменено 21.01.2017 13:03 Serginio1

Re: es6 Proxy
Здравствуйте, Serginio1, Вы писали:

Вобщем борюсь пока на стороне es6 c Proxy

Что удалос
1. Вызов методов и свойств
2. Установка свойств
3. Вызов объекта как функции
4. Создание объекта (new) через объект
5. Применение енумератора к объекту

export interface NetObjectinterface {
    (): void;
    Id: number;
    isNetObject: boolean;
}

function getNetObject(id: number): NetObjectinterface {
    let netObject = <NetObjectinterface>function (start: number) { };
    netObject.Id = id;
    netObject.isNetObject = true;
    return netObject;
}


export class NetObject {
    static GetNetObject(id: number) { return getNetObject(id); }
}

export var NetObjectHandler: ProxyHandler<NetObject> = {
    get: (target: NetObject, name: any) => {

        if (name === Symbol.iterator) {
            return function () {
                let nextIndex=5;

                return {
                    next: function () {

                        return nextIndex < 10 ?
                            { value: nextIndex++, done: false } :
                            { value: undefined, done: true };
                    }
                }


            }
        }

        if (name.startsWith('_')) {

            return "propery";

        }

        return (...args: any[]) => {

            let res: string = name;

            for (let param of args) {
                res += ", " + (typeof param);
                if (typeof param == "object") {
                    res += ", " + param().Id.toString();

                }
                else {
                    res += ", " + param.toString();

                }

            }

            return res;

        }


    },
    set: function (target, prop, value, receiver) {
        console.log("called: " + prop.toString() + " = " + value);
        return true;
    },

    apply: (target, that, args) => {
        if (args.length == 0)
            return target;
        return args[0];
    },

    construct: (target, argumentsList, newTarget) => {

        var res = NetObject.GetNetObject(5);
        return new Proxy(res, NetObjectHandler)

    }


}



И использование
 submit(user:User) {

            //let res = new NetObject(1);
            let res = NetObject.GetNetObject(1);
            let obj:any = new Proxy(res, NetObjectHandler);
            this.PropertyStr = obj._Property;
            obj._Property = 5;
            try{
             this.PropertyStr = obj().Id.toString();
             this.MethodStr = obj("Hello");
             this.ConstructStr = new obj(3)().Id.toString();
        }
            catch (e) {
                console.log("ошибка " + e);
        }


            for (let i of obj)
                console.log(i);

            let p = new Proxy([1,2,3], {
                enumerate: (target) => {
                    return ["a", "b", "c"];
                }
            });

            for (var x of p) { // "called"
                console.log(x);  // "a"
            }       
        }


Так как не нашел финализатора думаю удалять объекты через ()



Например StringBuilder при вызове методов возвращает ссылку на себя
    let =Net.GetType("System.Text.StringBuilder");
    let sb= new  StringBuilder("Первый");
    sb.Append("Новая Строка")(1);
    sb.AppendLine()(1);
    sb.Append("Вторая Строка")(1);
    sb.AppendLine()(1);
    
    sb.AppendFormat("AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина )(1); 
    sb.AppendLine()(1); 

    sb(1);
Re: es6 Proxy
Здравствуйте, Serginio1, Вы писали:

Вобщем борюсь пока на стороне es6 c Proxy

Что удалось
1. Вызов методов и свойств
2. Установка свойств
3. Вызов объекта как функции
4. Создание объекта (new) через объект
5. Применение енумератора к объекту

export interface NetObjectinterface {
    (): void;
    Id: number;
    isNetObject: boolean;
}

function getNetObject(id: number): NetObjectinterface {
    let netObject = <NetObjectinterface>function (start: number) { };
    netObject.Id = id;
    netObject.isNetObject = true;
    return netObject;
}


export class NetObject {
    static GetNetObject(id: number) { return getNetObject(id); }
}

export var NetObjectHandler: ProxyHandler<NetObject> = {
    get: (target: NetObject, name: any) => {

        if (name === Symbol.iterator) {
            return function () {
                let nextIndex=5;

                return {
                    next: function () {

                        return nextIndex < 10 ?
                            { value: nextIndex++, done: false } :
                            { value: undefined, done: true };
                    }
                }


            }
        }

        if (name.startsWith('_')) {

            return "propery";

        }

        return (...args: any[]) => {

            let res: string = name;

            for (let param of args) {
                res += ", " + (typeof param);
                if (typeof param == "object") {
                    res += ", " + param().Id.toString();

                }
                else {
                    res += ", " + param.toString();

                }

            }

            return res;

        }


    },
    set: function (target, prop, value, receiver) {
        console.log("called: " + prop.toString() + " = " + value);
        return true;
    },

    apply: (target, that, args) => {
        if (args.length == 0)
            return target;
        return args[0];
    },

    construct: (target, argumentsList, newTarget) => {

        var res = NetObject.GetNetObject(5);
        return new Proxy(res, NetObjectHandler)

    }


}



И использование
 submit(user:User) {

            //let res = new NetObject(1);
            let res = NetObject.GetNetObject(1);
            let obj:any = new Proxy(res, NetObjectHandler);
            this.PropertyStr = obj._Property;
            obj._Property = 5;
            try{
             this.PropertyStr = obj().Id.toString();
             this.MethodStr = obj("Hello");
             this.ConstructStr = new obj(3)().Id.toString();
        }
            catch (e) {
                console.log("ошибка " + e);
        }


            for (let i of obj)
                console.log(i);

            let p = new Proxy([1,2,3], {
                enumerate: (target) => {
                    return ["a", "b", "c"];
                }
            });

            for (var x of p) { // "called"
                console.log(x);  // "a"
            }       
        }


Так как не нашел финализатора думаю удалять объекты через ()



Например StringBuilder при вызове методов возвращает ссылку на себя
    let =Net.GetType("System.Text.StringBuilder");
    let sb= new  StringBuilder("Первый");
    sb.Append("Новая Строка")(1);
    sb.AppendLine()(1);
    sb.Append("Вторая Строка")(1);
    sb.AppendLine()(1);
    
    sb.AppendFormat("AppendFormat {0}, {1}, {2}, {3}, {4},", "Строка", 21, 45.89, ТекущаяДата(),истина )(1); 
    sb.AppendLine()(1); 

    sb(1);