// 引用自[JSPatch 实现原理详解]
require('UIView')
var view = UIView.alloc().init()
view.setBackgroundColor(require('UIColor').grayColor())
view.setAlpha(0.5)
require('UIView'), 在JS的全局作用域创建一个同名变量, 变量指向JS对象 {
__clsName: "UIView"
}
UIView.alloc().init(), 在JS上, 是没有定义alloc(), init()函数, JSPatch的做法是通过正则在方法执行之前替换成__c()元函数, 即UIView.__c('alloc')().__c('init')(), 替换逻辑在JPEngine#_evaluateScript()函数中实现, 而__c()元函数则在JS中定义的函数, 实现逻辑调用_methodFunc() {}, _methodFunc()实现如下var _methodFunc = function(instance, clsName, methodName, args, isSuper, isPerformSelector) {
...
var ret = instance ? _OC_callI(instance, selectorName, args, isSuper):
_OC_callC(clsName, selectorName, args)
return _formatOCToJS(ret)
}
_OC_callI()或_OC_callC(), 则是在JPEngine.m中通过JavaScriptCore定义的函数, 该函数实现即通过OC的Runtime能力调用JS定义的函数逻辑
核心流程逻辑
JPEngine#evaluateScript()执行JS代码, 在JPEngine#_evaluateScript()中, 将UIView.alloc().init()转成UIView.__c('alloc')().__c('init')()__c()元函数, 实现逻辑调用JavaScriptCore定义的_OC_callI(), 即通过JavaScriptCore与OC层进行通信_OC_callI()函数实现则是通过OC的Runtime能力调用JS定义的函数逻辑_OC_callI()执行结果返回