我可以在javascript中向'window'对象添加属性吗?

时间:2012-10-05 09:05:13

标签: javascript cross-browser

我可以在javascript中向'window'对象添加任何随机属性吗?有点像:

window.my_own_attr = "my_value"

对任何图书馆都有副作用吗?它是跨浏览器兼容的吗?

7 个答案:

答案 0 :(得分:46)

  

我可以在javascript中为'window'对象添加任何随机属性吗?

是的,就像你已经表现出来一样。

  

对任何库都有副作用吗?

不,除非您使用设置属性的库然后覆盖。

  

它是跨浏览器兼容的吗?

是的,完全。


话虽如此,这种做法通常不受欢迎。你最终可能会覆盖你不想要的东西。

答案 1 :(得分:7)

所有浏览器中,window是javascript全局命名空间。每个属性或方法都“存在”该命名空间中。因此,如果您将属性分配给window,则它实际上是全局变量

示例:

window.myConstant = 5;

function multiply(val){
  return myConstant * (val || 1);
}
multiply(10); //=> 50
multiply(); //=> 5

你必须对javascript框架保持谨慎。例如,如果您声明window.JQuery并使用JQuery框架,JQuery命名空间将被您的任务替换,使其无效。

答案 2 :(得分:2)

是的,你可以,但一般来说你不应该。

window对象也是JS默认的“全局”对象,因此所有全局变量都会被添加到那里。

除非你覆盖已经存在的属性,否则你不可能破坏任何东西,但是在window上转储变量或者创建大量全局变量被认为是不好的做法。

答案 3 :(得分:1)

在IE中,如果元素具有id,则该节点可作为属性在窗口对象上访问:

<div id="num"></div>

alert(num); //Element

num = 3; //throws exception

var num = 3; //ok

答案 4 :(得分:1)

我不会重复别人所说的话:这种做法的愚蠢。但是当使用像Angular和vanilla HTML / JS(或jQuery)代码混合的僵硬框架时,它会非常有用。这也是hacky和不赞成的,但有时候有很好的理由,比如你有很多预先存在的JS代码,这些代码很难融入框架。

对我来说,更有趣的问题是如何利用向全局window对象添加属性的能力。当我想将Angular提供程序(服务)的方法公开给代码时,我会使用一种模式,否则将无法注入服务,可能是因为它在Angular DI框架之外运行。我这样做的方式如下:

  1. 将您的服务定义为顶级模块中的提供者。
  2. 在app.component.js的构造函数或onInit中(或任何导入提供程序的顶级组件),正常注入提供程序,执行所需的任何一次初始化,然后调用window['MyServiceName'] = this
  3. 假设您已设计提供程序以遵循Singleton模式,现在可以从任何地方安全地调用提供程序的方法。非Angular脚本只需调用window['MyServiceName'].methodName()

    即可

答案 5 :(得分:0)

在使用相同的变量名之前,它将正常工作,与任何库没有冲突,将在所有浏览器中工作,但不建议这样做,因为这将创建全局JS变量。

答案 6 :(得分:0)

正如其他人所指出的,可以,是的,这意味着添加“全局变量”。

拥有全局变量不是最佳实践,但有时这是最简单的事情。例如,如果您使用IFrames并希望子窗口访问父窗口的某些属性。这样的属性必须是“全局”的,孩子才能访问它。但这也表明它不是“真正的全局”,而只是特定窗口的属性。但这可能会与其他属性名(例如,您在使用的某些库中在同一窗口中定义的函数的名称)发生冲突。

因此,我们知道全局变量是错误的。如果我们决定仍然使用它们,那么我们有什么办法可以减少它们的弊端?

是的:用一个或多或少的唯一名称定义一个SINGLE全局变量,然后将一个对象存储到其中。将您需要的所有其他“变量”存储为该单个对象的字段。

这样,您无需添加多个全局变量(每个窗口)。还不错。

或多或少地对其进行唯一命名,因此它不太可能与其他人的单个全局名称冲突。例如,您可以使用名称+'s'作为变量名称:

window.Panus  = {}; 

:-)