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

Javascript 在既是值访问器又是函数的对象上定义属性,javascript,typescript,Javascript,Typescript,有一个API(d3.map),它实现了一个方法size。但是,我想扩展它,使其保持向后兼容,但它也可以用作值访问器/获取器(因为这是在ES6now中指定的): 这可能吗?没有办法做你想做的事。 唯一的出路是将size()替换为getSize() 更新 有一个解决办法。只需对新特性使用密钥长度,对向后兼容性使用密钥大小。它看起来像一个C#列表类 class Map { private count = 0; public get length(): number {

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


这可能吗?

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

更新 有一个解决办法。只需对新特性使用密钥长度,对向后兼容性使用密钥大小。它看起来像一个C#
列表

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)

不幸的是,我的朋友,没有办法。。。看看JS对象核心——它只是一个字典,其中字符串是键,值是对象。现在想象一下,
size
键应该同时返回函数和类似于原始对象的数字。。。是的,这是不可能的。此外,数字只是一个基本对象,它不能像函数一样工作,因为它是另一个层次结构节点,并且它不是与数字类的交叉引用。但是,有一个很好的解决方案,只需使用key
length
获得新特性,使用key
size
获得向后兼容性,在我的帖子中查找更新
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)