美文网首页web前端
用ts实现一个属性类

用ts实现一个属性类

作者: 姜治宇 | 来源:发表于2020-12-03 15:40 被阅读0次

    最近一直在用angular,angular的设计理念是面向对象的,每个功能都封装在class里面,跟java的思想差不多。
    最近遇到这样一个需求:
    用openlayer画一个点,点的属性(比如颜色color、大小size等)要对应做一个仪表盘来管理。
    功能倒是不复杂,我们可以很快写出这个Point类来:

    class Point{
        color:string;
        size:string;
        constructor(color:string,size:string){
            this.color = color;
            this.size = size;
        }
    }
    

    不过好景不长,项目经理后来增加了需求:
    点的属性需要分组管理,并且可以排序。
    比如color要分到“外观”这个组里,这样我们在定义颜色属性时,就不能单单只考虑key和value了,还要增加所属分组group这个属性;如果要排序,还要增加排序order这个属性。
    那,这又该如何设计Point类呢?
    我们可以将属性单独设计一个类,比如叫CssProp吧,这个类会放group和order这样的一些额外属性,然后我们在Point中声明color属性时,就需指定CssProp这个类型。

    interface Params {
        id: number;
        name: string;
        group: string;
    }
    
    class Base {
        id: number;
        name: string;
        group: string;
        constructor(params: Params) {
            this.id = params.id;
            this.name = params.name;
            this.group = params.group;
        }
    }
    
    
    class CssProp extends Base {
        title: string;
        private _value: string;
    
        constructor(params: Params, title: string) {
    
            super(params);
    
            this.title = title;
        }
        public get value() {
            console.log('get ok');
            return this._value;
        }
        public set value(v) {
            console.log('set ok');
            this._value = v;
        }
    
    
    }
    
    class Point {
    
        color: CssProp = new CssProp({ id: 1, name: 'backgroud-color', group: '外观' }, '颜色');
    
        constructor() {
            this.color.value = '#ff0000';
        }
    }
    
    var p = new Point();
    console.log(p.color);
    /*
    set ok
    CssProp {
      id: 1,
      name: 'backgroud-color',
      group: '外观',
      title: '颜色',
      _value: '#ff0000'
    }
    */
    

    相关文章

      网友评论

        本文标题:用ts实现一个属性类

        本文链接:https://www.haomeiwen.com/subject/xybmwktx.html