2012-07-25 53 views
0

所以我写一个函数来扩展对象计算有多少项是在其中,所以它可以被用作这样的:扩展对象会导致jQuery的错误

test = {"foo": "bar", "baz": 7, "darth": "maul"} 

test.count() 
=> 3 

我写的代码,例如:

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

这是我在与原型延伸的第一次尝试,而我从内的jquery.js收到此错误:

Uncaught TypeError: Object function() { 
    var count = 0, key; 
    for (key in this) { 
    if (this.hasOwnProperty(key)) { 
     count++; 
    } 
    } 
    return count; 
} has no method 'replace' 

堆栈跟踪点回到我打电话css一个jQuery对象的onLoad:

$img.css({left: 20, top: 50}); 

不,我觉得有什么具体的关于该行,但我认为这可能是很好的提供。

我在这里做错了吗?

回答

2

一个教训,为什么扩展原生类型的原型可能是一个坏主意。 :)

jQuery某处,它正在测试一个名为count的属性的存在的通用对象,然后将其视为字符串。既然你现在已经让这个属性一直存在,它发现它,但它不是一个字符串(如预期的那样)并且破坏了代码。

+0

我已经将函数名更改了几次,以得到相同的结果。那么,这是否意味着在使用jQuery时不能扩展Object?我可以把它写成一个直接的函数,但是扩展对我来说更有意义(与字符串的“长度”相比) – 2012-07-25 18:13:21

+1

它可能正在寻找它不希望存在的任何属性。改变Object的原型几乎是个好主意(其他类型的程度较低),因为这会影响检查对象属性的* everything *。像if(myobject.count){...}这样的代码是测试财产存在的事实标准。如果您真的想在通用对象上使用自定义方法,那么只需创建自己的原型并使用它来代替原生对象。 – 2012-07-25 18:16:01

+0

好吧,那只是个屁股。感谢您的帮助 – 2012-07-25 18:17:34