2017-05-09 71 views
1

我正在做一個簡單的擴展名並希望覆蓋頁面上的javascript函數。對於我來說JavaScript太複雜太理解了。這是代碼的一部分:覆蓋嵌套的javascript函數

}), define("components/Payout", ["react", "game-logic/clib", "game-logic/stateLib"], function(e, t, n) { 
    var r = e.DOM; 
    return e.createClass({ 
     displayName: "Payout", 
     mixins: [e.addons.PureRenderMixin], 
     propTypes: { 
      engine: e.PropTypes.object.isRequired 
     }, 
     getInitialState: function() { 
      return { 
       payout: 0 
      } 
     }, 
     componentDidMount: function() { 
      window.requestAnimationFrame(this.draw) 
     }, 
     draw: function() { 
      if (this.isMounted()) { 
       var e = t.calcGamePayout(t.getElapsedTimeWithLag(this.props.engine)); 
       e ? this.setState({ 
        payout: e * n.currentPlay(this.props.engine).bet 
       }) : this.setState({ 
        payout: null 
       }), window.requestAnimationFrame(this.draw) 
      } 
     }, 
     render: function() { 
      var e = n.currentPlay(this.props.engine).bet < 1e4 ? 2 : 0; 
      return r.span({ 
       id: "payout" 
      }, t.formatSatoshis(this.state.payout, e)) 
     } 
    }) 
}), 

我想'劫持'的功能是「渲染」功能。我將如何從外部的JS文件中解脫出來?

我想要的是用調整的東西來替換該函數的內容。

+0

您首先需要覆蓋'define'(或者混淆了這裏使用的模塊加載器的內部暴露內容)。然後你就可以訪問'.prototype.render'屬性並劫持它。 – Bergi

回答

0

如果變量obj包含的代碼返回的對象,你可以分配到obj.render

obj.render = function() { 
    // your code here 
}; 

請注意,您的代碼將無法使用rt,或者n變量,如原來的render功能呢。這些變量僅在原始範圍中可用,並且您的功能在該範圍之外。

如果你想能夠調用原有的渲染方法,你可以這樣做:

var orig_render = obj.render; 
obj.render = function() { 
    var oldrender = orig_render.bind(this); 
    // your code here, call oldrender() to call original version 
}; 

這就是所謂的monkey patching