当我尝试使用以下方法创建JavaScript对象时,我有一个网页:
var myVar = {};
结果对象总是包含一个继承属性,这会干扰我的代码并且不会发生,除非只在此页面上,任何人都知道为什么?
答案 0 :(得分:5)
有人走了,在Object.prototype
上放了一些东西。自己检查一下:
for(var k in {}) alert(k); // should get NO alerts
至于跟踪它,使用上面的输出来搜索你的代码库。要检查的第一个地方是<script src="..."></script>
标记中包含的任何外部库。例如,Prototype库的旧版本增加了Object.prototype
。
更新@Ahmad 的评论:
您有两种选择:
将实现移出原型,而不是将事物扩展为第一个参数,例如:
Object.inherit = function(obj, superClass, superClassName) {
/* change "this" to "obj" all throughout the code here */
}
重构所有的地方:
foo.inherit(a, b)
代替:
Object.inherit(foo, a, b)
这种方法显然可能需要大量的重新分解工作。好处是您可以单独留下Object.prototype
。
第二种方法是保留单独执行Object.prototype.inherit = ...
的代码,而是重构您正在尝试编写的代码以使用hasOwnProperty
,这将告诉您是否属性已直接设置在您的对象上(即没有在对象的原型链中跋涉):
for(var k in myVar) {
if (myVar.hasOwnProperty(k)) {
/* ... */
}
}
当然,在进入代码库的所有未来hasOwnProperty
代码中使用for..in
时一定要明智。
您可以同时清理代码库和,以防止其他库输入自己更改Object.prototype
的代码。
答案 1 :(得分:0)
也许您所包含的某些脚本正在修改Object.prototype以添加自己的自定义函数。