我对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
我在这里缺少什么?
答案 0 :(得分:1)
当您将方法声明从Object.prototype
直接移动到Object
构造函数时,该方法在所有对象的原型链中不再可用(BTW是一件好事),我建议您为函数提供一个参数,传递你需要操作的对象,并改变你的方法调用:
// from `this.objData.getOwnPropertyCount()` to:
Object.getOwnPropertyCount(this.objData);
显然,在您的实现中,您应该计算传递对象的属性,因为this
将引用上面示例中的Object
构造函数。