支付宝jspath,js看不懂,拿出来分享一下

2016-10-26  本文已影响493人  xiaoliang1
5975EEF8-1D96-4FBF-BE49-4C0C28188F8A.png

jspatch.js:

var global = this

;(function() {

  var _ocCls = {};
  var _jsCls = {};

  var _formatOCToJS = function(obj) {
    if (obj === undefined || obj === null) return false
    if (typeof obj == "object") {
      if (obj.__obj) return obj
      if (obj.__isNil) return false
    }
    if (obj instanceof Array) {
      var ret = []
      obj.forEach(function(o) {
        ret.push(_formatOCToJS(o))
      })
      return ret
    }
    if (obj instanceof Function) {
        return function() {
            var args = Array.prototype.slice.call(arguments)
            var formatedArgs = _OC_formatJSToOC(args)
            for (var i = 0; i < args.length; i++) {
                if (args[i] === null || args[i] === undefined || args[i] === false) {
                formatedArgs.splice(i, 1, undefined)
            } else if (args[i] == nsnull) {
                formatedArgs.splice(i, 1, null)
            }
        }
        return _OC_formatOCToJS(obj.apply(obj, formatedArgs))
      }
    }
    if (obj instanceof Object) {
      var ret = {}
      for (var key in obj) {
        ret[key] = _formatOCToJS(obj[key])
      }
      return ret
    }
    return obj
  }
  
  var _methodFunc = function(instance, clsName, methodName, args, isSuper, isPerformSelector) {
    var selectorName = methodName
    if (!isPerformSelector) {
      methodName = methodName.replace(/__/g, "-")
      selectorName = methodName.replace(/_/g, ":").replace(/-/g, "_")
      var marchArr = selectorName.match(/:/g)
      var numOfArgs = marchArr ? marchArr.length : 0
      if (args.length > numOfArgs) {
        selectorName += ":"
      }
    }
    var ret = instance ? _OC_callI(instance, selectorName, args, isSuper):
                         _OC_callC(clsName, selectorName, args)
    return _formatOCToJS(ret)
  }

  var _customMethods = {
    __c: function(methodName) {
      var slf = this

      if (slf instanceof Boolean) {
        return function() {
          return false
        }
      }
      if (slf[methodName]) {
        return slf[methodName].bind(slf);
      }

      if (!slf.__obj && !slf.__clsName) {
        throw new Error(slf + '.' + methodName + ' is undefined')
      }
      if (slf.__isSuper && slf.__clsName) {
          slf.__clsName = _OC_superClsName(slf.__obj.__realClsName ? slf.__obj.__realClsName: slf.__clsName);
      }
      var clsName = slf.__clsName
      if (clsName && _ocCls[clsName]) {
        var methodType = slf.__obj ? 'instMethods': 'clsMethods'
        if (_ocCls[clsName][methodType][methodName]) {
          slf.__isSuper = 0;
          return _ocCls[clsName][methodType][methodName].bind(slf)
        }

        if (slf.__obj && _ocCls[clsName]['props'][methodName]) {
          if (!slf.__ocProps) {
            var props = _OC_getCustomProps(slf.__obj)
            if (!props) {
              props = {}
              _OC_setCustomProps(slf.__obj, props)
            }
            slf.__ocProps = props;
          }
          var c = methodName.charCodeAt(3);
          if (methodName.length > 3 && methodName.substr(0,3) == 'set' && c >= 65 && c <= 90) {
            return function(val) {
              var propName = methodName[3].toLowerCase() + methodName.substr(4)
              slf.__ocProps[propName] = val
            }
          } else {
            return function(){ 
              return slf.__ocProps[methodName]
            }
          }
        }
      }

      return function(){
        var args = Array.prototype.slice.call(arguments)
        return _methodFunc(slf.__obj, slf.__clsName, methodName, args, slf.__isSuper)
      }
    },

    super: function() {
      var slf = this
      if (slf.__obj) {
        slf.__obj.__realClsName = slf.__realClsName;
      }
      return {__obj: slf.__obj, __clsName: slf.__clsName, __isSuper: 1}
    },

    performSelectorInOC: function() {
      var slf = this
      var args = Array.prototype.slice.call(arguments)
      return {__isPerformInOC:1, obj:slf.__obj, clsName:slf.__clsName, sel: args[0], args: args[1], cb: args[2]}
    },

    performSelector: function() {
      var slf = this
      var args = Array.prototype.slice.call(arguments)
      return _methodFunc(slf.__obj, slf.__clsName, args[0], args.splice(1), slf.__isSuper, true)
    }
  }

  for (var method in _customMethods) {
    if (_customMethods.hasOwnProperty(method)) {
      Object.defineProperty(Object.prototype, method, {value: _customMethods[method], configurable:false, enumerable: false})
    }
  }

  var _require = function(clsName) {
    if (!global[clsName]) {
      global[clsName] = {
        __clsName: clsName
      }
    } 
    return global[clsName]
  }

  global.require = function(clsNames) {
    var lastRequire
    clsNames.split(',').forEach(function(clsName) {
      lastRequire = _require(clsName.trim())
    })
    return lastRequire
  }

  var _formatDefineMethods = function(methods, newMethods, realClsName) {
    for (var methodName in methods) {
      if (!(methods[methodName] instanceof Function)) return;
      (function(){
        var originMethod = methods[methodName]
        newMethods[methodName] = [originMethod.length, function() {
          try {
            var args = _formatOCToJS(Array.prototype.slice.call(arguments))
            var lastSelf = global.self
            global.self = args[0]
            if (global.self) global.self.__realClsName = realClsName
            args.splice(0,1)
            var ret = originMethod.apply(originMethod, args)
            global.self = lastSelf
            return ret
          } catch(e) {
            _OC_catch(e.message, e.stack)
          }
        }]
      })()
    }
  }

  var _wrapLocalMethod = function(methodName, func, realClsName) {
    return function() {
      var lastSelf = global.self
      global.self = this
      this.__realClsName = realClsName
      var ret = func.apply(this, arguments)
      global.self = lastSelf
      return ret
    }
  }

  var _setupJSMethod = function(className, methods, isInst, realClsName) {
    for (var name in methods) {
      var key = isInst ? 'instMethods': 'clsMethods',
          func = methods[name]
      _ocCls[className][key][name] = _wrapLocalMethod(name, func, realClsName)
    }
  }

  global.defineClass = function(declaration, properties, instMethods, clsMethods) {
    var newInstMethods = {}, newClsMethods = {}
    if (!(properties instanceof Array)) {
      clsMethods = instMethods
      instMethods = properties
      properties = null
    }

    var realClsName = declaration.split(':')[0].trim()

    _formatDefineMethods(instMethods, newInstMethods, realClsName)
    _formatDefineMethods(clsMethods, newClsMethods, realClsName)

    var ret = _OC_defineClass(declaration, newInstMethods, newClsMethods)
    var className = ret['cls']
    var superCls = ret['superCls']

    _ocCls[className] = {
      instMethods: {},
      clsMethods: {},
      props: {}
    }

    if (superCls.length && _ocCls[superCls]) {
      for (var funcName in _ocCls[superCls]['instMethods']) {
        _ocCls[className]['instMethods'][funcName] = _ocCls[superCls]['instMethods'][funcName]
      }
      for (var funcName in _ocCls[superCls]['clsMethods']) {
        _ocCls[className]['clsMethods'][funcName] = _ocCls[superCls]['clsMethods'][funcName]
      }
      if (_ocCls[superCls]['props']) {
        _ocCls[className]['props'] = JSON.parse(JSON.stringify(_ocCls[superCls]['props']));
      }
    }

    _setupJSMethod(className, instMethods, 1, realClsName)
    _setupJSMethod(className, clsMethods, 0, realClsName)

    if (properties) {
      properties.forEach(function(o){
        _ocCls[className]['props'][o] = 1
        _ocCls[className]['props']['set' + o.substr(0,1).toUpperCase() + o.substr(1)] = 1
      })
    }
    return require(className)
  }

  global.defineProtocol = function(declaration, instProtos , clsProtos) {
      var ret = _OC_defineProtocol(declaration, instProtos,clsProtos);
      return ret
  }

  global.block = function(args, cb) {
    var slf = this
    if (args instanceof Function) {
      cb = args
      args = ''
    }
    var callback = function() {
      var args = Array.prototype.slice.call(arguments)
      return cb.apply(slf, _formatOCToJS(args))
    }
    return {args: args, cb: callback, __isBlock: 1}
  }
  
  if (global.console) {
    var jsLogger = console.log;
    global.console.log = function() {
      global._OC_log.apply(global, arguments);
      if (jsLogger) {
        jsLogger.apply(global.console, arguments);
      }
    }
  } else {
    global.console = {
      log: global._OC_log
    }
  }

  global.defineJSClass = function(declaration, instMethods, clsMethods) {
    var o = function() {},
        a = declaration.split(':'),
        clsName = a[0].trim(),
        superClsName = a[1] ? a[1].trim() : null
    o.prototype = {
      init: function() {
        if (this.super()) this.super().init()
        return this;
      },
      super: function() {
        return superClsName ? _jsCls[superClsName].prototype : null
      }
    }
    var cls = {
      alloc: function() {
        return new o;
      }
    }
    for (var methodName in instMethods) {
      o.prototype[methodName] = instMethods[methodName];
    }
    for (var methodName in clsMethods) {
      cls[methodName] = clsMethods[methodName];
    }
    global[clsName] = cls
    _jsCls[clsName] = o
  }
  
  global.YES = 1
  global.NO = 0
  global.nsnull = _OC_null
  global._formatOCToJS = _formatOCToJS
  
})()

第一个main.js:

;
(function() {
    try {
        defineClass('MPBadgeManager', {
            init: function() {
                var inst = self.__c("ORIGinit")()
                var proxy = inst.__c("valueForKey")("_proxy")
                if (proxy) {
                    proxy.__c("setIVarDirectAccess")(false)
                }
                return inst
            }
        })
    } catch (e) {
        _OC_catch(e.message, e.stack)
    }
})();


第二个main.js:

;
(function() {
    try {
        defineClass('O2OHelper', {}, {
            logPageEndWithSpmId_view_param(spmId, view, param) {
                if (!spmId.__c("length")() || !view) {
                    return
                } else {
                    self.__c("ORIGlogPageEndWithSpmId_view_param")(spmId, view, param)
                }
            }
        })
    } catch (e) {
        _OC_catch(e.message, e.stack)
    }
})();


第三个main.js:

;
(function() {
    try {
        defineClass('O2OAddAppraiseController', {
            createSubViews: function() {
                self.__c("ORIGcreateSubViews")()
                self.__c("syncCheckBox")().__c("setChecked")(0)
            }
        })
    } catch (e) {
        _OC_catch(e.message, e.stack)
    }
})();

第四个main.js:

;(function(){try{require('APSKMessage, NSURL')

defineClass('O2OShareManager', {
    share2ALPTimeLine: function() {
        var shareDic = self.__c("shareDic")().__c("toJS")()
        var logo = shareDic['logo']
        var t = shareDic['title']
        var l = 'alipays://platformapi/startapp?appId=20000238&target=merchant&shopId=' + shareDic['shopId'] + '&chInfo=ch_liveshare__spmid_a13.b43__chsub_store'

        var shareMsg
        if (logo.length) {
            shareMsg = APSKMessage.__c("messageWithURL_icon_title_description")(NSURL.__c("URLWithString")(l), null, t, t)
            shareMsg.__c("setIconUrl")(NSURL.__c("URLWithString")(logo))
            shareMsg.__c("setScheme")(l)
            shareMsg.__c("setExtraInfo")({'alipayUrl':l})
            shareMsg.__c("setContentType")('url')
        } else {
            shareMsg = APSKMessage.__c("messageWithURL_icon_title_description")(NSURL.__c("URLWithString")(l), null, t, t)
            shareMsg.__c("setExtraInfo")({'alipayUrl':l})
        }

        var weakSelf = __weak(self)
        self.__c("shareClient")().__c("shareMessage_toChannel_completionBlock_bizType")(shareMsg, 'kAPSKChannelALPTimeLine', block('NSError *, NSDictionary *', function(error, userInfo) {
            weakSelf.__c("toastShareResult")(false)
        }), 'O2O_merchant')
    }
}),

defineClass('O2OAddAppraiseController', {
    commentFeed: function() {
        var commentFeed = self.__c("ORIGcommentFeed")()

        var ext = commentFeed.__c("ext")().__c("toJS")()
        var addAppraiseModel = self.__c("addAppraiseModel")()
        var shopScheme = 'alipays://platformapi/startapp?appId=20000238&target=merchant&shopId=' + addAppraiseModel.__c("shopId")().__c("toJS")() + '&chInfo=ch_liveshare__spmid_a13.b43__chsub_review'
        ext['appraiseScheme'] = shopScheme
        commentFeed.__c("setExt")(ext)

        if (self.__c("uploadedImageURLs")().__c("count")() == 0) {
            var validShopName = addAppraiseModel.__c("shopName")().__c("toJS")() ? addAppraiseModel.__c("shopName")().__c("toJS")() : ''
            var validShopLogo = addAppraiseModel.__c("shopLogo")().__c("toJS")() ? addAppraiseModel.__c("shopLogo")().__c("toJS")() : ''
            var mediaList = "[{'type':'link','src':'" + validShopLogo + "','ext':{'linkTitle':'" + validShopName + "','linkUrl':'" + shopScheme + "'}}]"
            commentFeed.__c("setMediaList")(mediaList)
        }

        return commentFeed
    }
})}catch(e){_OC_catch(e.message, e.stack)}})();

第五个个main.js:

;(function(){try{require('JPEngine').__c("addExtensions")(['JPCFunction']);
defineCFunction("UIAccessibilityIsVoiceOverRunning", "BOOL")

defineClass('HAppEditCellView', {
            setEditType: function(editType) {
                self.__c("ORIGsetEditType")(editType);
                self.__c("setAccessibilityTraits")((editType == 1) ? 256 : 0);
            },

            setEditType_animate: function(editType, animate) {
                self.__c("ORIGsetEditType_animate")(editType, animate);
                self.__c("setAccessibilityTraits")((editType == 1) ? 256 : 0);
            },
            
            tapGestureHandel: function(tapGesture) {
                if (self.__c("editType")() == 0) {
                    self.__c("super")().__c("tapGestureHandel")(tapGesture);
                } else if (UIAccessibilityIsVoiceOverRunning()) {
                    self.__c("editButtonClicked")();
                }
            },
});

defineClass('HAllAppViewController', {
            editButtonClicked: function(cellView) {
                self.__c("ORIGeditButtonClicked")(cellView);
                cellView.__c("setAccessibilityTraits")(256);
            },
});

defineClass('ALPWithdrawSuccessViewController', {
    viewDidAppear: function(animated) {
        self.__c("super")().__c("viewDidAppear")(animated);
        self.__c("navigationController")().__c("navigationBar")().__c("setAccessibilityElementsHidden")(false);
    },
});

defineClass('O2ONaviBarFactory', {}, {
    o2oIndexSearchBarViewWithVC: function(vc) {
        var centerView = require('O2ONaviBarCenterView').__c("alloc")().__c("initWithVC")(vc)
        centerView.__c("setIsAccessibilityElement")(1)
        centerView.__c("setAccessibilityLabel")('搜索')
        return centerView
    }
});
}catch(e){_OC_catch(e.message, e.stack)}})();
上一篇下一篇

猜你喜欢

热点阅读