使用所有对象都可以使用的函数扩充Object对象

时间:2011-07-31 21:07:22

标签: javascript prototypal-inheritance

我对Object的扩充的动机是我希望能够轻松处理用于简单存储数据的对象(如Java中的“hashmap”)。我想轻松地做hashmap.size()。

假设我的对象有一个名为objData的属性,当这样做时它是空的:

var objData = {};

我的对象有一些方法可以将数据添加到objData,如下所示:

this.objData[key1name] = data1;

我的对象也有一些访问objData的方法:

if(this.objData.size() == 0):

当然,不存在这样的方法。这是我扩充Object对象的动机:

        Object.prototype.getOwnPropertyCount = function ( ) {
            var count = 0;
            for(var item in this) {
                if (this.hasOwnProperty(item)) {
                    count += 1;
                }
            }
            return count;
        };

现在我应该能够做到:

if (this.objData.getOwnPropertyCount() == 0)

或:

if(!objData.getOwnPropertyCount())

但实际上,当我尝试加载与我编写的任何代码完全无关的页面时,我会收到错误。我在谷歌地图api的main.js中出现错误。巫毒

所以我改变了我的扩充来扩充实际的Object而不是Object.prototype:

Object.getOwnPropertyCount = function ( ) {
    //calculate the count
    return count;
};

现在我在Firefox中遇到以下错误:

this.objData.getOwnPropertyCount is not a function

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

当您将方法声明从Object.prototype直接移动到Object构造函数时,该方法在所有对象的原型链中不再可用(BTW是一件好事),我建议您为函数提供一个参数,传递你需要操作的对象,并改变你的方法调用:

// from `this.objData.getOwnPropertyCount()` to:
Object.getOwnPropertyCount(this.objData);

显然,在您的实现中,您应该计算传递对象的属性,因为this将引用上面示例中的Object构造函数。