阅读Ext学习Javascript(二) Core/Ext.extend从继承说起

本文解析了JavaScript中实现继承的基本方法,并深入探讨了Ext框架中的extend方法如何提供更强大的继承支持,包括属性重写及方便的扩展机制。
 

一般的,如果我们定义一个类,会定义一个function对象,然后将公用方法写到其原型上,例如:
var Tiger = function(){}
Tiger.prototype.Hunting = function(){}

但是要建立一个完善的框架或者类库,没有继承帮忙,组织代码将是一件非常辛苦且难以管理的工作。Js中的类是function对象,实现继承,主要要将子类的原型设置为父类的一个实例(这样子类就用有了父类原型的所有成员),并重新将子类原型的构造器设置为子类自己。如以下代码所示:
function Animal(){}
function Tiger(){}
Tiger.prototype = new Animal()
Tiger.prototype.constructor = Tiger

实现继承并不难,将上面的Animal和Tiger参数化封装为一个方法就可以实现(当然实际应用中就要复制一些了),代码如下:
function Extend(subFn, superFn){
    subFn.prototype = new superFn()
    subFn.prototype.constructor = subFn
}
Ext作为一个优秀的框架,当然也少不了继承的实现。如前一篇文章所谈到的,现在让我们一行行代码理解Ext.extend
        extend : function(){
            // inline overrides
            var io = function(o){
                for(var m in o){
                    this[m] = o[m];
                }
            };
            return function(sb, sp, overrides){
                if(typeof sp == 'object'){
                    overrides = sp;
                    sp = sb;
                    sb = function(){sp.apply(this, arguments);};
                }
                var F = function(){}, sbp, spp = sp.prototype;
                F.prototype = spp;
                sbp = sb.prototype = new F();
                sbp.constructor=sb;
                sb.superclass=spp;
                if(spp.constructor == Object.prototype.constructor){
                    spp.constructor=sp;
                }
                sb.override = function(o){
                    Ext.override(sb, o);
                };
                sbp.override = io;
                Ext.override(sb, overrides);
                return sb;
            };
        }()

本来只有两行代码就可以实现的继承变成了近30行,Ext都做了什么呢?通常情况下只传入两个类型的话(subFn和superFn),上面的代码将简化为
        extend : function(){
            // inline overrides
            var io = function(o){
                for(var m in o){
                    this[m] = o[m];
                }
            };
            return function(sb, sp, overrides){
                 var F = function(){}, sbp, spp = sp.prototype;
                F.prototype = spp;
                sbp = sb.prototype = new F();
                sbp.constructor=sb;
                sb.superclass=spp;
                 sb.override = function(o){
                    Ext.override(sb, o);
                };
                sbp.override = io;
                Ext.override(sb, overrides);
                return sb;
            };
        }()

定义一个空函数,将其原型设置为sp的原型spp,其实F就是sp的一个替身,理解的时候可以认为就是sp。将子类sb的原型设置为F的一个实例,然后再将其原型的构造器设置为自己sb,为了方便找到父类sp,在子类sb上添加了一个superclass属性为父类sp的原型spp。为了方便扩展属性,在子类sb上添加了属性重写的override方法,也在其原型上添加了override方法(这样其所有实例对象就可以从一个对象重写现有属性了)。

到这里算是对继承有了一些了解(不到位的地方在以后的阅读中继续加强)。好了,有了继承的支持,我们就可以加速类型的扩展了。

继续 阅读Ext 学习Javascript(三) Event和Observeable

+------------------------------------------------------------------- | 感谢您使用ThinkPHP开发框架 ^_^ +------------------------------------------------------------------- | 大道至简 开发由我 WE CAN DO IT,JUST THINK +------------------------------------------------------------------- | 版本信息:ThinkPHP 3.1 Release 2012/9/5 +------------------------------------------------------------------- | Copyright(c) 2006-2012 http://thinkphp.cn All rights reserved. +------------------------------------------------------------------- [ 简介 ] ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架, 遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而 诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性 能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在 社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,众多 的典型案例确保可以稳定用于商业以及门户级的开发。 经过6年的不断积累和重构,3.0版本在框架底层的定制和扩展方面趋于完善, 使得应用的开发范围和需求适应度更加扩大,能够满足不同程度的开发人员的 需求。而且引入了全新的CBD(核心+行为+驱动)架构模式,旨在打造DIY框架 和AOP编程体验,让ThinkPHP能够在不同方面都能快速满足项目和应用的需求, 并且正式引入SAE、REST和Mongo支持。 使用ThinkPHP,你可以更方便和快捷的开发和部署应用。当然不仅仅是企业级 应用,任何PHP应用开发都可以从ThinkPHP的简单和快速的特性中受益。 ThinkPHP本身具有很多的原创特性,并且倡导大道至简,开发由我的开发理念, 用最少的代码完成更多的功能,宗旨就是让WEB应用开发更简单、更快速。 为此ThinkPHP会不断吸收和融入更好的技术以保证其新鲜和活力,提供WEB应 用开发的最佳实践!经过6年来的不断重构和改进,ThinkPHP达到了一个新的 阶段,能够满足企业开发中复杂的项目需求,足以达到企业级和门户级的开 发标准。 [ 协议 ] ThinkPHP遵循Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP, 甚至允许把你的ThinkPHP应用采用商业闭源发布。 具体参考LICENSE.txt内容 [ 特性 ] CBD架构:ThinkPHP3.0版本引入了全新的CBD(核心+行为+驱动)架构模式, 打造框架底层DIY定制和类AOP编程体验。利用这一新的特性,开发人员可以 方便地通过模式扩展为自己量身定制一套属于自己或者企业的开发框架。 编译机制:独创的项目编译机制,有效减少OOP开发中文件加载的性能开销。 改进后的项目编译机制,可以支持编译文件直接作为入口载入,并且支持常量 外部载入,利于产品发布。 类库导入:采用基于类库包和命名空间的方式导入类库,让类库导入看起来更 加简单清晰,而且还支持自动加载和别名导入。为了方便项目的跨平台移植, 系统还可以严格检查加载文件的大小写。 URL和路由:系统支持普通模式、PATHINFO模式、REWRITE模式和兼容模式的 URL方式,支持不同的服务器和运行模式的部署,配合URL路由功能,让你随心 所欲的构建需要的URL地址和进行SEO优化工作。支持灵活的规则路由和正则路 由,以及路由重定向支持,带给开发人员更方便灵活的URL优化体验。 调试模式:框架提供的调试模式可以方便用于开发过程的不同阶段,包括开发、 测试和演示等任何需要的情况,不同的应用模式可以配置独立的项目配置文件。 只是小小的性能牺牲就能满足调试开发过程中的日志和分析需要,并确保将来的 部署顺利,一旦切换到部署模式则可以迅速提升性能。 ORM :简洁轻巧的ORM实现,配合简单的CURD以及AR模式,让开发效率无处不在。 数据库:支持包括Mysql、Sqlite、Pgsql、Oracle、SqlServer、Mongo等数据库, 并且内置分布式数据库和读写分离功能支持。系统支持多数据库连接和动态切换 机制,犹如企业开发的一把利刃,跨数据库应用和分布式支持从此无忧。 查询语言:内建丰富的查询机制,包括组合查询、快捷查询、复合查询、区间 查询、统计查询、定位查询、多表查询、子查询、动态查询和原生查询,让你的 数据查询简洁高效。 动态模型:无需创建任何对应的模型类,轻松完成CURD操作,支持多种模型之间 的动态切换,让你领略数据操作的无比畅快和最佳体验。 扩展模型:提供了丰富的扩展模型,包括:支持序列化字段、文本字段、只读字 段、延迟写入、乐观锁、数据分表等高级特性的高级模型;可以轻松动态地创建 数据库视图的视图模型;支持关联操作的关联模型;支持Mongo数据库的Mongo模 型等等,都可以方便的使用。 模块分组:不用担心大项目的分工协调和部署问题,分组帮你解决跨项目的难题, 还可以支持对分组的级域名部署支持。 模板引擎:系统内建了一款卓越的基于XML的编译型模板引擎,支持两种类型的 模板标签,融合了Smarty和JSP标签库的思想,并内置布局模板功能和标签库扩展 支持。通过驱动还可以支持Smarty、EaseTemplate、TemplateLite、Smart等其他第 三方模板引擎。 AJAX支持:内置和客户端无关的AJAX数据返回方法,支持JSON、XML和EVAL类型 返回客户端,而且可以扩展返回数据格式,系统不绑定任何AJAX类库,可随意使 用自己熟悉的AJAX类库进行操作。 SAE支持:提供了新浪SAE平台的强力支持,具备“横跨性”和“平滑性”,支持本地化 开发和调试以及部署切换,让你轻松过渡到SAE开发,打造全新的SAE开发体验。 RESTFul支持:REST模式提供了RESTFul支持,为你打造全新的URL设计和访问体验, 同时为接口应用提供了支持。 多语言支持:系统支持语言包功能,项目和分组都可以有单独的语言包,并且可以 自动检测浏览器语言自动载入对应的语言包。 模式扩展:除了标准模式外,还提供了AMF、PHPRpc、Lite、Thin和Cli模式扩展支 持,针对不同级别的应用开发提供最佳核心框架,还可以自定义模式扩展。 自动验证和完成:自动完成表单数据的验证和过滤,新版新增了IP验证和有效期验 证等更多的验证方式,配合自动完成可以生成安全的数据对象。 字段类型检测:系统会自动缓存字段信息和字段类型,支持非法字段过滤和字段类 型强制转换,确保数据写入和查询更安全。 缓存机制:系统支持包括文件方式、APC、Db、Memcache、Shmop、Sqlite、Redis、 Eaccelerator和Xcache在内的动态数据缓存类型,以及可定制的静态缓存规则,并 提供了快捷方法进行存取操作。 扩展机制:系统支持包括模式扩展、行为扩展、类库扩展、驱动扩展、模型扩展、 控制器扩展、Widget扩展在内的强大灵活的扩展机制,让你不再受限于核心的不足 和无所适从,随心DIY自己的框架扩展应用,满足企业开发中更加复杂的项目需求。 [ 要求 ] ThinkPHP3.1需要PHP5.2.0以上版本支持,可以运行在任何系统环境下面。 [ 安装 ] ThinkPHP无需安装,下载ThinkPHP核心包或者完整版之后,把解压后的目录拷贝到 你的WEB服务器或者WEB目录即可。 [ 鸣谢 ] 特别要鸣谢ThinkPHP团队和所有关注和支持ThinkPHP的用户。 [ 支持 ] 更多内容和支持请访问ThinkPHP官方网站http://thinkphp.cn/ 和论坛 http://bbs.thinkphp.cn。
Started by user administrator Obtained uat_tc/frontend/Jenkinsfile from git http://47.100.45.4:8060/pipeline/dbm-ci.git [Pipeline] Start of Pipeline [Pipeline] node Running on Jenkins in /var/jenkins_home/workspace/prd-frontend-dbm-provider-miniapp-ext [Pipeline] { [Pipeline] stage [Pipeline] { (Declarative: Checkout SCM) [Pipeline] checkout The recommended git tool is: NONE using credential dbm-deploy > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/prd-frontend-dbm-provider-miniapp-ext/.git # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url http://47.100.45.4:8060/pipeline/dbm-ci.git # timeout=10 Fetching upstream changes from http://47.100.45.4:8060/pipeline/dbm-ci.git > git --version # timeout=10 > git --version # 'git version 2.39.5' using GIT_ASKPASS to set credentials > git fetch --tags --force --progress -- http://47.100.45.4:8060/pipeline/dbm-ci.git +refs/heads/*:refs/remotes/origin/* # timeout=10 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 Checking out Revision 39c6e6fb53f67b249d725128e27fe95d10d8c634 (refs/remotes/origin/master) > git config core.sparsecheckout # timeout=10 > git checkout -f 39c6e6fb53f67b249d725128e27fe95d10d8c634 # timeout=10 Commit message: "前端部署脚本修改" > git rev-list --no-walk 39c6e6fb53f67b249d725128e27fe95d10d8c634 # timeout=10 [Pipeline] } [Pipeline] // stage [Pipeline] withEnv [Pipeline] { [Pipeline] stage [Pipeline] { (Declarative: Tool Install) [Pipeline] tool [Pipeline] envVarsForTool [Pipeline] tool [Pipeline] envVarsForTool [Pipeline] } [Pipeline] // stage [Pipeline] withEnv [Pipeline] { [Pipeline] stage [Pipeline] { (Checkout) [Pipeline] tool [Pipeline] envVarsForTool [Pipeline] tool [Pipeline] envVarsForTool [Pipeline] withEnv [Pipeline] { [Pipeline] git The recommended git tool is: NONE using credential dbm-deploy > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/prd-frontend-dbm-provider-miniapp-ext/.git # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url http://47.100.45.4:8060/ifourthwall-frontend/dbm-provider-miniapp-ext.git # timeout=10 Fetching upstream changes from http://47.100.45.4:8060/ifourthwall-frontend/dbm-provider-miniapp-ext.git > git --version # timeout=10 > git --version # 'git version 2.39.5' using GIT_ASKPASS to set credentials > git fetch --tags --force --progress -- http://47.100.45.4:8060/ifourthwall-frontend/dbm-provider-miniapp-ext.git +refs/heads/*:refs/remotes/origin/* # timeout=10 > git rev-parse refs/remotes/origin/uat^{commit} # timeout=10 Checking out Revision d96cc2d276749987f956838156865e2c99d68c70 (refs/remotes/origin/uat) > git config core.sparsecheckout # timeout=10 > git checkout -f d96cc2d276749987f956838156865e2c99d68c70 # timeout=10 > git branch -a -v --no-abbrev # timeout=10 > git checkout -b uat d96cc2d276749987f956838156865e2c99d68c70 # timeout=10 Commit message: "合并分支 'test' 到 'uat'" First time build. Skipping changelog. [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Build) [Pipeline] tool [Pipeline] envVarsForTool [Pipeline] tool [Pipeline] envVarsForTool [Pipeline] withEnv [Pipeline] { [Pipeline] script [Pipeline] { [Pipeline] sh + rm -rf node_modules + node -v v18.20.3 + git remote set-url origin https://github.com/evrone/postcss-px-to-viewport.git + npm install --registry=https://registry.npmmirror.com npm warn deprecated yaeti@0.0.6: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. added 346 packages in 2s 77 packages are looking for funding run `npm fund` for details + npm run build:uat > cssccrane@0.0.0 build:uat > vite build --mode uat postcss-px-to-viewport: postcss.plugin was deprecated. Migration guide: https://evilmartians.com/chronicles/postcss-8-plugin-migration vite v5.4.20 building for uat... transforming... DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [import]: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0. More info and automated migrator: https://sass-lang.com/d/import ╷ 1 │ @use "@/assets/css/constant.scss" as *;@import "./base.scss"; │ ^^^^^^^^^^^^^ ╵ src/assets/css/index.scss 1:48 root stylesheet DEPRECATION WARNING [import]: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0. More info and automated migrator: https://sass-lang.com/d/import ╷ 2 │ @import "./constant.scss"; │ ^^^^^^^^^^^^^^^^^ ╵ src/assets/css/index.scss 2:9 root stylesheet DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0. More info: https://sass-lang.com/d/legacy-js-api ✓ 430 modules transformed. Generated an empty chunk: "@antfu". Generated an empty chunk: "vue". Generated an empty chunk: "vue-demi". x Build failed in 1.87s error during build: [vite:esbuild-transpile] Transform failed with 2 errors: assets/vant-!~{00b}~.js:2878:6: ERROR: The symbol "bem" has already been declared assets/vant-!~{00b}~.js:5104:6: ERROR: The symbol "bem" has already been declared  The symbol "bem" has already been declared 2876| const Tabs = withInstall(stdin_default$f); 2877| 2878| const [name$c, bem] = createNamespace("picker-group"); | ^ 2879| const PICKER_GROUP_KEY = Symbol(name$c); 2880| extend({ The symbol "bem" has already been declared 5102| const Notify = withInstall(stdin_default$2); 5103| 5104| const [name$1, bem, t] = createNamespace("search"); | ^ 5105| const searchProps = extend({}, fieldSharedProps, { 5106| label: String,  at failureErrorWithLog (/var/jenkins_home/workspace/prd-frontend-dbm-provider-miniapp-ext/node_modules/esbuild/lib/main.js:1472:15) at /var/jenkins_home/workspace/prd-frontend-dbm-provider-miniapp-ext/node_modules/esbuild/lib/main.js:755:50 at responseCallbacks.<computed> (/var/jenkins_home/workspace/prd-frontend-dbm-provider-miniapp-ext/node_modules/esbuild/lib/main.js:622:9) at handleIncomingPacket (/var/jenkins_home/workspace/prd-frontend-dbm-provider-miniapp-ext/node_modules/esbuild/lib/main.js:677:12) at Socket.readFromStdout (/var/jenkins_home/workspace/prd-frontend-dbm-provider-miniapp-ext/node_modules/esbuild/lib/main.js:600:7) at Socket.emit (node:events:517:28) at addChunk (node:internal/streams/readable:368:12) at readableAddChunk (node:internal/streams/readable:341:9) at Readable.push (node:internal/streams/readable:278:10) at Pipe.onStreamRead (node:internal/stream_base_commons:190:23) [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // stage [Pipeline] stage [Pipeline] { (Deploy) Stage "Deploy" skipped due to earlier failure(s) [Pipeline] getContext [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: script returned exit code 1 Finished: FAILURE
最新发布
09-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值