这篇文章给大家分享的是有关鸿蒙系统中JavaScript框架的案例分析的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
我在前文中曾经介绍过鸿蒙的JavaScript框架,这几天终于把JS仓库编译通过了,期间踩了不少坑,也给鸿蒙贡献了几个公关。今天我们就来逐行分析鸿蒙系统中的JS框架。
文中的所有代码都基于鸿蒙的当前最新版(版本为677 ed06提交日期为2020-09-10)。
鸿蒙系统使用JavaScript开发GUI是一种类似于微信小程序,轻应用的模式。而这个MVVM模式中,V其实是由c++来承担的.JavaScript代码只是其中的ViewModel层。
鸿蒙JS框架是零依赖的,只在开发打包过程中使用到了一些npm包。打包完之的代码是没有依赖任何npm包的。我们先看一下使用鸿蒙JS框架写出来的JS代码到底长什么样。
出口默认{ 数据(){返回{数:1}; }, 增加(){ + + this.count; }, 减少(){ ——this.count; }, }复制代码
如果我不告诉你这是鸿蒙,你甚至会以为它是vue或小程序。如果单独把JS拿出来使用(脱离鸿蒙系统),代码是这样:
const vm=new ViewModel ({ 数据(){返回{数:1}; }, 增加(){ + + this.count; }, 减少(){ ——this.count; }, });console.log (vm.count);//1 vm.increase (); console.log (vm.count);//2 vm.decrease (); console.log (vm.count);//1复制代码
仓库中的所有JS代码实现了一个<强>响应式系统>强,充当了MVVM中的ViewModel。
下面我们逐行分析。
src目录中一共有4个目录,总计8个文件。其中一个是单元测试。还有1个性能分析。再除去2个索引。js文件,有用的文件一共是4个。也是本文分析的重点。
src ├──__test__ │└──index.test.js ├──核心 │└──index.js ├──index.js ├──观察者 │├──index.js │├──observer.js │├──subject.js │└──utils.js └──分析器 └──index.js复制代码
首先是入口文件,src/索引。js,只有2行代码:
从& # 39;进口{ViewModel}。/核心# 39;;出口默认视图模型;复制代码
其实就是重新导出。
另一个类似的文件是src/观察者/索引。js,也行是2代码:
出口{观察者}& # 39;。/观察者# 39;;出口{主题}& # 39;。/话题# 39;;复制代码
观察者和主题实现了一个观察者模式.subject是主题,也就是被观察者.observer是观察者。当主题有任何变化时需要主动通知被观察者。这就是响应式。
这2个文件都使用到了src/观察者/跑龙套。js,所以我们先分析一下跑龙套文件,分3部分。
<强>第一部分强>
出口const ObserverStack={栈:[], 推动(观察者){this.stack.push(观察者); }, pop(){返回this.stack.pop (); }, 前(){返回this.stack [this.stack。长度- 1]; } };复制代码
首先是定义了一个用来存放观察者的栈,遵循后进先出的原则,内部使用<代码>堆栈> 代码数组来存储。
- <李>入栈操作<代码> 代码>,和数组的<代码> 代码>推函数一样,在栈顶放入一个观察者观察者。李> <李>出栈操作<代码>流行> 代码,和数组的流行<代码> 代码>函数一样,在将栈顶的观察者删除,并返回这个被删除的观察者。李> <李>取栈顶元素<代码> 代码>,和<代码>流行代码>操作不同,<代码> 代码>顶部是把栈顶元素取出来,但是并不删除。李>
<强>第二部分强>
出口const SYMBOL_OBSERVABLE=& # 39; __ob__& # 39;;出口const canObserve=目标=比;typeof目标===& # 39;对象# 39;;复制代码
定义了一个字符串常量<代码> SYMBOL_OBSERVABLE> 代码。为了后面用着方便。
定义了一个函数<代码> canObserve> 代码,目标是否可以被观察。只有对象才能被观察,所以使用<代码> typeof> 代码来判断目标的类型。等等,好像有什么不对。如果<代码> 代码>目标为零代码> <代码>的话,函数也会返回<代码> 代码>。如果<代码>零> 代码不可观察,那么这就是一个错误。(写这篇文章的时候我已经提了一个公关,并询问了这种行为是否是期望的行为)。
<强>第三部分强>
出口const defineProp=(目标、关键值)=比;{Object.defineProperty(目标、关键,{可列举的:假的,价值}); };复制代码鸿蒙系统中JavaScript框架的案例分析