// 引用自[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()
执行结果返回