2012-06-21 80 views
2

考慮:如何覆蓋封閉內的函數?

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

是否有可能改變從的杆法之外的封閉

+1

如果您無法訪問'Foo'或其實例,請不要使用。 ('Foo.prototype.bar'只是一個字符串順便說一句;)) –

+0

@FelixKling - 我有權訪問它,我相信。這個例子源於jQuery的ui庫(datepicker)。是的,但如果我想將字符串更改爲函數呢? –

+0

需要了解更多信息。如何使用外部功能?什麼都返回了?它是一個名稱空間模式嗎?外括號表示自我執行,'(function(){...})();'但執行的地方在哪裏? –

回答

3

如果你有機會到構造函數(Foo),並要覆蓋bar所有實例,你一個新的值賦給Foo.prototype.bar

如果你有的Foo例如,你可以只覆蓋bar該實例:

instance.bar = ...; 

或所有實例通過,再次重寫原型方法。對於這一點,你必須先拿到樣機,您可以與Object.getPrototypeOf[MDN]做到:

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

但是請注意,這是一個ES5方法不可用IE < = 8或者Opera。


如果您既不能訪問構造函數,也不能訪問實例,除了通過修改源代碼之外,不能更改屬性。

+0

太棒了!你提出的第二個建議是完美的,我最終得到了這個:'Object.getPrototypeOf($。ui.datepicker).bar = function(){alert(「beer」); };'完全跑了一堆。很明顯,我會在那裏放置不同的代碼,但它的工作。 –