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