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

akk*_*ore 34 javascript cross-browser

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

window.my_own_attr = "my_value"
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*ice 53

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

是的,就像你已经表现出来的那样.

它对任何图书馆都有副作用吗?

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

它是跨浏览器兼容的吗?

是的,完全.


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

  • +1以信息方式回答所有三个OP问题. (8认同)

Koo*_*Inc 8

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

例:

window.myConstant = 5;

function multiply(val){
  return myConstant * (val || 1);
}
multiply(10); //=> 50
multiply(); //=> 5
Run Code Online (Sandbox Code Playgroud)

你必须谨慎使用javascript框架.例如,如果您声明window.JQuery并使用JQuery框架,则JQuery命名空间将被您的赋值替换,使其无用.


Aln*_*tak 5

是的,您可以,但一般来说您不应该这样做。

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

除非您覆盖已经存在的属性,否则不太可能破坏任何内容,但将变量转储window或以其他方式创建大量全局变量被认为是不好的做法。

  • 然而,如果您创建一个具有许多属性的对象,那么混乱就可以控制了。 (2认同)

小智 5

我不会重复其他人所说的:这种做法的老套性。但当使用像 Angular 这样的严格框架与普通 HTML / JS(或 jQuery)代码混合时,它会非常有用。这也是很hacky和不受欢迎的,但有时有充分的理由,比如如果你有很多预先存在的JS代码,将很难集成到框架中。

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

  1. 在顶级模块中将您的服务定义为提供者。
  2. 在 app.component.js 的构造函数或 onInit 中(或者导入提供程序的任何顶级组件),正常注入提供程序,执行它需要的任何一次初始化,然后调用window['MyServiceName'] = this

假设您已将提供程序设计为遵循单例模式,那么现在可以从任何地方安全地调用您的提供程序的方法。非 Angular 脚本只需调用window['MyServiceName'].methodName()