Javascript 有没有一种简单的方法来消除污染?
我开发的客户端javascript库在某些方面使用对象作为散列。它使用属性名作为键,使用for…in循环遍历从Json数据解析的对象。如。。。(伪代码) 不幸的是,MooTools(和Prototype等)将方法添加到全局名称空间中,因此我的for…in循环现在会迭代MooTools的添加(例如limit、round、times、each),当它将逻辑应用到这些方法时会导致错误,就好像它是预期的数据一样 由于它是一个库,我不得不期望它将与MooTools、Prototype等一起使用。有没有简单的方法解决这个问题?我目前的解决方案只是将对象传递给一个方法,该方法去掉特定于MooTools的条目并返回干净的对象,但这意味着还要检查Prototype和所有类似的库添加了什么,这似乎是一种倒退的做法 我的另一个解决方案是停止依赖属性名作为键,并在循环中执行验证,以确保我正在查看想要查看的数据。在我重写之前,我想知道是否有人有更好的解决方案Javascript 有没有一种简单的方法来消除污染?,javascript,mootools,prototypejs,Javascript,Mootools,Prototypejs,我开发的客户端javascript库在某些方面使用对象作为散列。它使用属性名作为键,使用for…in循环遍历从Json数据解析的对象。如。。。(伪代码) 不幸的是,MooTools(和Prototype等)将方法添加到全局名称空间中,因此我的for…in循环现在会迭代MooTools的添加(例如limit、round、times、each),当它将逻辑应用到这些方法时会导致错误,就好像它是预期的数据一样 由于它是一个库,我不得不期望它将与MooTools、Prototype等一起使用。有没有简单
谢谢:)如果您的客户端对象不是从其他自定义对象继承的,那么您可以看看是否可以使用javascript的
Object.hasOwnProperty
方法来确定某个属性是否存在于对象本身中,而不是通过prototype对象在继承链中
对于不支持此方法的浏览器,您可以编写一个包装器来检查:
var hasOwnProperty = function(object, property) {
if(object.hasOwnProperty) {
return object.hasOwnProperty(property);
}
var prop = object[property];
return typeof(prop) !== "undefined" && prop !==
object.constructor.prototype[property];
}
如何使用它:
for(var key in someObj) {
if(hasOwnProperty(someObj, key)) {
// we are good to go!
}
}
如果我没有弄错的话,您正在寻找方法。同时使用
MooTools
和Prototype
不是一个好主意,因为它们修改了基础原型,不能和平共存。也就是说,它们都不会修改Object.prototype
(不再是了),因此除了您自己的属性之外,您应该不会看到任何其他属性
您是否添加了一个插件,该插件可能正在添加这些属性?您能否给出一个更完整的示例,说明这些属性在哪里列出,以及您正在使用的这些库的版本
hasOwnProperty
检查将解决原型问题,但首先不需要这样做,因此最好查明到底是哪个脚本出错了
MooTools创建了一个类型,只是因为他们不想修改Object.prototype
。以下是文档中的引用:
散列
一种自定义对象({})实现,在设置、获取或迭代时不考虑原型。非常有用,因为在JavaScript中,我们不能使用Object.prototype。相反,我们可以使用Hash.prototype
由于“limit”、“round”、“times”和“each”都是数组原型的附加方法,所以您的主要失败在于使用“for-in”来迭代数组。您应该先检查对象的类型,然后仅对对象使用“for in”,对数组使用“for”。
顺便说一句,“for in”是迭代数组最慢的方法 我不认为你会发现现在有太多浏览器没有
hasOwnProperty
方法,在IE上,它是在IE5.5(2000年7月发布!)上引入的。@CMS我一直认为IE6不支持它,感谢你指出所有这些都是Number
上的附加方法,而不是Array
。我想我们在这里看不到完整的例子,因为枚举一个数字与OP所显示的相差甚远。好的,舍入和限制来自numer,其他的来自数组。用“for in”在我不知道的对象上迭代是个坏主意。
for(var key in someObj) {
if(hasOwnProperty(someObj, key)) {
// we are good to go!
}
}