在对象上定义属性,该对象既是值访问器又是函数

时间:2015-10-01 09:18:05

标签: javascript typescript

有一个API(d3.map具体),它实现了方法size。但是我想扩展它以使它保持向后兼容,但它也可以用作值访问器/获取器(因为它是现在在ES6中指定的方式):

var map = d3.map();
map.set(0, 1);
console.log(map.size()); // Old code, should still work
xhr.send(JSON.stringify(map.size)); // Should also work (as a getter)

这可能吗?

1 个答案:

答案 0 :(得分:1)

没有办法做你喜欢的事。 唯一的出路是将size()替换为getSize()

class Map{
    public get size(){
        return 1;
    }

    public set size(size:number){

    }

    getSize():number{
        return 1;
    }
} 

更新

有一种解决方案。只需使用密钥长度来获取新功能,并使用密钥大小来实现向后兼容。它看起来像C#List类。

class Map {
    private count = 0;


    public get length(): number {
        return this.count;
    }

    public set length(length: number) {
        this.count = length;
    }

    public size(): number;
    public size(size: number): void;
    public size(size?: number): any {
        if (size) {
            this.count = size;
        } else {
            return this.count;
        }
    }

}

你的例子

var map = d3.map();
map.set(0, 1);
console.log(map.size()); // Old code, should still work
xhr.send(JSON.stringify(map.length)); // Should also work (as a getter)