【问题标题】:How can I overwrite a function inside of a closure?如何覆盖闭包内的函数?
【发布时间】:2012-06-22 07:33:15
【问题描述】:

给定:

(function() {
 function Foo() {
 }
 $.extend(Foo.prototype, {
  bar: 'hasBeer'
 });
})

是否可以从该闭包的外部更改 bar 方法?

【问题讨论】:

  • 如果您无权访问Foo 或它的实例,则不会。 (Foo.prototype.bar 只是一个字符串 btw ;))
  • @FelixKling - 我相信我可以访问它。这个例子源于 jQuery 的 ui 库(datepicker)。是的,但是如果我想将字符串更改为函数呢?
  • 需要了解更多。外部函数是如何使用的?有什么退还的吗?它是命名空间模式吗?外括号表示自执行,(function(){...})(); 但执行在哪里?

标签: javascript jquery


【解决方案1】:

如果您有权访问构造函数 (Foo) 并且想要覆盖所有实例的 bar,则为 Foo.prototype.bar 分配一个新值。

如果您有一个Foo实例,您可以只覆盖该实例的bar

instance.bar = ...;

或者对于所有实例,再次覆盖原型方法。为此,您必须首先获得原型,您可以使用Object.getPrototypeOf [MDN]

Object.getPrototypeOf(instance).bar = ...;

但请注意,这是一种 ES5 方法,不适用于 IE


如果您既无权访问构造函数,也无权访问实例,则无法更改属性,只能修改源代码。

【讨论】:

  • 太棒了!你提出的第二个建议是完美的,我最终得到了这个:Object.getPrototypeOf($.ui.datepicker).bar = function () { alert("beer"); };,这完全是一团糟。显然,我将在那里放置不同的代码,但它完成了它的工作。
猜你喜欢
  • 2016-12-05
  • 2017-09-11
  • 2014-06-22
  • 2017-05-29
  • 2013-05-07
  • 2013-12-14
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多