如何向Javascript数组添加“size”属性?

4
为了在Array对象中添加size()方法,我需要进行以下操作:
if (!Array.size) {
    Array.prototype.size = function() {
        return this.length;
    };
}

有没有一种简单的方法来定义 size 属性,使其像 length 一样工作?

(我并不真正需要它,我只是想了解这是否是在 JavaScript 中容易实现的。)

3个回答

8
使用 ES5 可以实现。在 Array 原型上添加一个 size 属性,
Object.defineProperty(Array.prototype, "size", {
    get: function() {
        return this.length;
    },
    set: function(newLength) {
        this.length = newLength;
    }
});

var x = [1, 2, 3];
x.length    // 3
x.size      // 3

x.push(4);
x           // [1, 2, 3, 4]
x.length    // 4
x.size      // 4

x.length = 2;
x           // [1, 2]
x.size = 1;
x           // [1]

它基本上作为长度的包装器运行。在肉眼看来像属性,但由底层函数支持。
感谢@Matthew的评论,这个size属性就像是一个完整的长度包装器。

2
дҪ еҸҜд»Ҙж·»еҠ дёҖдёӘsetterжқҘж”№еҸҳthis.lengthгҖӮ - Matthew Crumley
@Matthew - 那是个好主意,我只是想保持这个示例最小化。 - Anurag

1
if(!Array.size)
{
    Array.prototype.__defineGetter__('size', function(){
        return this.length;
    });
}

var a = new Array();
a.push(1);
a.push(4);

console.log(a.size);

虽然我不完全确定这在跨浏览器上的友好度有多高(至少应该在 Chrome 和 FF 上运行)。


1

我假设你已经知道这不是一个真实的问题。

length 属性被修改以适应数组的大小,并通过 shift()pop() 等方法反映出来。

因此,你需要一个方法来获取 length 属性。

Anurag 展示了如何使用 ES5 完成这个任务


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接