zoukankan      html  css  js  c++  java
  • JSPatch 技术要点

    作者:干掉crash
    链接:https://zhuanlan.zhihu.com/p/21884786
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    如果有方法不遵守语言规则呢?实际上在 JS 界,有个很常用的伎俩,就是预编译:


    也就是我们写的脚本不直接拿给 JS 引擎执行,而是进行一些转换后才执行,在现代框架这个用法很常见, react/vue 都用了,甚至还有像 coffieScript 这样把 JS 完全换成另一种语言的做法。

    想到这一点,刚才的问题就很好解决了。

    只需要把所有函数调用在执行前都替换一遍,变成去调用一个固定的 __c 函数, 这个 __c 函数模拟了 ruby/lua 等语言的元方法机制,对方法调用进行转发。

    还是以调用 UIView 的 alloc 方法为例,这个语句在执行之前会被替换为调 UIView 的 __c 方法,把 “alloc” 作为字符串参数穿进去,在 __c 方法里判断调用者 UIView 是不是 OC 对象。如果是,就把类名和传进来的方法名传到 OC 层进行调用,如果不是,就调用回 JS 这个对象的方法。

    这样做简洁高效地解决了前面的问题,不需要去 OC 遍历每个类的方法,不需要存储这些方法,就可以调用任意 OC 方法,只需要给 JS 基类定义一个 __c 方法就可以了。正则替换后无论调用 OC 的什么方法,都不会有语法错误,因为都变成调用这个 __c 方法,在这个 __c 方法里做处理去 OC 层调用相应的方法就行了。

  • 相关阅读:
    查看Mysql版本
    Day03_SpringCloud2
    Day01_SpringBoot
    【Java面试题】如何判断一个字符串中某个字符出现的次数?
    你以为这样写Java代码很6,但我看不懂
    smart-socket实战:玩转心跳消息
    JVM 对象分配过程
    Spring Cloud基于Redis实现的分布式锁
    Python10行以内代码能有什么高端操作
    会话技术之Cookie详解
  • 原文地址:https://www.cnblogs.com/feng9exe/p/6138864.html
Copyright © 2011-2022 走看看