Ext.create细节分析
var win1 = Ext.create('Ext.window.Window', { //实例化方法四 : 使用 完整的 Extjs 类名
width: 800,
title: 'define test4',
height:600
});
主要涉及到Ext.js Inventory.js ClassManager.js Class.js Loader.js Boot.js
在ClassManager.js中,
create: function () {
var name = arguments[0],
nameType = typeof name,
args = arraySlice.call(arguments, 1),
cls; if (nameType === 'function') {
cls = name;
} else {
if (nameType !== 'string' && args.length === 0) {
args = [name];
if (!(name = name.xclass)) {
name = args[0].xtype;
if (name) {
name = 'widget.' + name;
}
}
} //<debug>
if (typeof name !== 'string' || name.length < 1) {
throw new Error("[Ext.create] Invalid class name or alias '" + name +
"' specified, must be a non-empty string");
}
//</debug> name = Manager.resolveName(name); // resolveName 在 Inventory.js中,好像是根据简称获取全名
cls = Manager.get(name); // 根据名称获得类
} // Still not existing at this point, try to load it via synchronous mode as the last resort
if (!cls) {
//<debug>
//<if nonBrowser>
!isNonBrowser && // 看不懂,怎么就知道没加载该类的js文件呢
//</if>
Ext.log.warn("[Ext.Loader] Synchronously loading '" + name + "'; consider adding " +
"Ext.require('" + name + "') above Ext.onReady"); // 这里就是debug版经常看到的提示require类的日志,平时都懒得挨个require
//</debug> Ext.syncRequire(name); // 加载类的js cls = Manager.get(name);
} //<debug>
if (!cls) {
throw new Error("[Ext.create] Unrecognized class name / alias: " + name);
} if (typeof cls !== 'function') {
throw new Error("[Ext.create] Singleton '" + name + "' cannot be instantiated.");
}
//</debug> return Manager.getInstantiator(args.length)(cls, args); // 生成该类的实例
// 这里分为两部分看
// Manager.getInstantiator(args.length)是一个函数对象,来路见下面代码块分析
// Manager.getInstantiator(args.length)(cls, args)执行了这个函数,就 new 了一个 cls 类型的实例
// 从而我们就实现了Ext.create给定一个类名,得到这个类,然后得到这个类的一个实例,这里的类实际是自定义的引用类型
// 可以理解为一个创建实例的自定义function,在Ext.define里定义的,Ext.define细节可以看看我的Ext.define细节分析文章
},
/**
* @private
* @param length
*/
getInstantiator: function(length) {
var instantiators = this.instantiators,
instantiator,
i,
args; instantiator = instantiators[length]; // 有个缓存机制 if (!instantiator) {
i = length;
args = []; for (i = 0; i < length; i++) {
args.push('a[' + i + ']');
} instantiator = instantiators[length] = new Function('c', 'a', 'return new c(' + args.join(',') + ')'); // 这里组合出了一个函数
/* 展开实际是
function (c, a){
return new c(a[0], a[1]..., a[length - 1])
}
这样就巧妙的实现了根据一个字符串的引用类型来创建该类型的实例,
如果是Ext的基本类那么肯定不用管了,如果是自定义引用类型在Ext.define时就应该添加到Ext的类型中了,作为一个function
*/
//<debug>
instantiator.name = "Ext.create" + length;
//</debug>
} return instantiator;
},
Ext.create细节分析的更多相关文章
- Ext.define细节分析
自己写的其实还是不懂,再看看别人写的吧Extjs4 源码分析系列一 类的创建过程https://www.cnblogs.com/creazyguagua/p/4302864.htmlhttp://ww ...
- Ext.create方法分析
Ext.create方法实际上是Ext.ClassManager的instantiate的别名 分析如下: (function(Class, alias, arraySlice, arrayFrom, ...
- Ext create动态加载分析
主要涉及到Ext.js Inventory.js ClassManager.js Class.js Loader.js Boot.js 在ClasManager.js的Ext.create中 Ext. ...
- rip路由协议 细节分析及实例配置【完整版】
rip路由协议 细节分析及实例配置[完整版] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从中发现 ...
- 如何使用Ext.create() 调用一个窗体
Ext.define("Scripts.Code.QM.OutgoingQuality.OQC.ReinspRequest.view.DefectContentsDetailInfoWind ...
- Ext.create使用(下)
本文介绍第三种使用方法: //通过类的引用实例化一个类 var w1 = Ext.create(Ext.window.Window, {//类的引用 title: '窗体', html:'<fo ...
- Ext.create使用(上)
本文介绍前两种使用方法: 通过full name, alias 或者 alternate name实例化一个类 // 别名 // alias var window = Ext.create('widg ...
- ExtJS4中Ext.onReady、Ext.define、Ext.create
1.Ext.onReady 说明:onReady内的语句块会在页面上下文加载后再执行. 2.Ext.define 说明:创建类,可以继承其他类,也可以被继承. 例子1: 1 <script ty ...
- 转: Ext拖拽分析
整个Ext架构中组件是其重要的组成部分,除了少部分(如树的结点)的界面表现元素不是在这样的一个体系中,大部分的页面表现元素都被绑定在这个体系之中,下面从这个体系的最底层即在这个继承体系的最高层进行研究 ...
随机推荐
- 【react】---styled-components的基本使用---【巷子】
一.官网地址 https://www.styled-components.com/ 二.styled-components 1.styled-components 样式化组件,主要作用是它可以编写实际 ...
- SSH框架下的表单重复提交
前几天做了一个功能,是在某个操作后,刷新父页面的,刷新时弹出了下面图的框: 网上查了之后发现这个框是表单重复提交时出现的.分析后发现,这个页面的上一个动作是form submit(在ssh框架下),这 ...
- 2018ACM-ICPC焦作区域赛【反思总结】
摸银结束回来,整个人都轻松了. 自CCPC打铁以来的这两个月真的太痛苦了. 俱乐部退役的退役停训的停训,好冷清啊. 前期切题很稳,前四题两个小时1A. 过了四题之后好像心态有点飘,然后开题就慢了,想题 ...
- .net webservice的get支持,
默认创建的webservices.asmx是不支持get的, 如 [WebMethod] public string HelloWorld() { return "Hello World&q ...
- Yarn && npm设置镜像源
安装yarn npm i -g yarn yarn yarn config set registry https://registry.npm.taobao.org --global yarn con ...
- expect远程登录服务器并执行命令
#!/usr/bin/expectset timeout 120 #设置执行超时时间,任何输入120秒后退出set password "password" ...
- [daily][gnucash] 复式记账
管理, 是成就人生的第一步. 管钱,是第一步中的第一小步. 选了又选,终于选了一个软件,gnucash, 但是, 他有点专业, 用之前需要搞懂一下会计概念. 即: 复式记账 gnucash手册的这一章 ...
- [dpdk][kernel][driver] 如何让DPDK的UIO开机自动加载到正确的网卡上
0. 前言 开了虚拟机,开始dpdk之前,我每天都干这几件事: [root@dpdk potatos]# modprobe uio [root@dpdk potatos]# insmod /root/ ...
- ORACLE DIRECTORY目录管理步骤
ORACLE DIRECTORY目录管理步骤 ORACLE的 DIRECTORY在数据库中是个目录的路径,需要在操作系统中有相应的目录与之对应:ORACLE目录的作用就是让ORACLE数据库和操作系统 ...
- es基本修改相关的
一.修改mapping POST linewell_assets_mgt_es/lw_devices/_mapping { "lw_devices": { "proper ...