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细节分析的更多相关文章

  1. Ext.define细节分析

    自己写的其实还是不懂,再看看别人写的吧Extjs4 源码分析系列一 类的创建过程https://www.cnblogs.com/creazyguagua/p/4302864.htmlhttp://ww ...

  2. Ext.create方法分析

    Ext.create方法实际上是Ext.ClassManager的instantiate的别名 分析如下: (function(Class, alias, arraySlice, arrayFrom, ...

  3. Ext create动态加载分析

    主要涉及到Ext.js Inventory.js ClassManager.js Class.js Loader.js Boot.js 在ClasManager.js的Ext.create中 Ext. ...

  4. rip路由协议 细节分析及实例配置【完整版】

    rip路由协议 细节分析及实例配置[完整版] RIP呢,这是一个比较重要的知识点,所以它的知识覆盖面很广泛:但是呢,我将会对碰到的问题进行一些分析解刨(主要是为了帮助自己理清思维):也希望能够从中发现 ...

  5. 如何使用Ext.create() 调用一个窗体

    Ext.define("Scripts.Code.QM.OutgoingQuality.OQC.ReinspRequest.view.DefectContentsDetailInfoWind ...

  6. Ext.create使用(下)

    本文介绍第三种使用方法: //通过类的引用实例化一个类 var w1 = Ext.create(Ext.window.Window, {//类的引用 title: '窗体', html:'<fo ...

  7. Ext.create使用(上)

    本文介绍前两种使用方法: 通过full name, alias 或者 alternate name实例化一个类 // 别名 // alias var window = Ext.create('widg ...

  8. ExtJS4中Ext.onReady、Ext.define、Ext.create

    1.Ext.onReady 说明:onReady内的语句块会在页面上下文加载后再执行. 2.Ext.define 说明:创建类,可以继承其他类,也可以被继承. 例子1: 1 <script ty ...

  9. 转: Ext拖拽分析

    整个Ext架构中组件是其重要的组成部分,除了少部分(如树的结点)的界面表现元素不是在这样的一个体系中,大部分的页面表现元素都被绑定在这个体系之中,下面从这个体系的最底层即在这个继承体系的最高层进行研究 ...

随机推荐

  1. day_6.16网络编程

    单线程服务器select版: select ---->最多1024个 poll ----->解决了套接字上限的问题----->轮询检测 关于 sys模块: 通过fd找套接字 协程: ...

  2. 第39级台阶|2013年蓝桥杯B组题解析第三题-fishers

    第39级台阶 小明刚刚看完电影<第39级台阶>,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个台阶.先迈左脚, ...

  3. ABP之事件总线(4)

    在上一篇的随笔中,我们已经初步完成了EventBus,但是EventBus中还有诸多的问题存在,那么到底有什么问题呢,接下来我们需要看一看ABP中的源码是如何定义EventBus的. 1.第一个点 在 ...

  4. 异常详细信息: System.ArgumentException: 不支持关键字: “metadata”。

    ASP.NET MVC中报的一个错误... 异常详细信息: System.ArgumentException: 不支持关键字: “metadata”. 其实这个是我修改web.config文件造成的, ...

  5. Codeforces 219C - Color Stripe - [DP]

    题目链接:http://codeforces.com/problemset/problem/219/C 题意: 给你 $n$ 个方块排成水平一排,每个方块都涂上 $k$ 种颜色中的一种.要求对尽量少的 ...

  6. nowcoder 206A - Birthday - [最小费用最大流]

    题目链接:https://www.nowcoder.com/acm/contest/206/A 题目描述 恬恬的生日临近了.宇扬给她准备了一个蛋糕.正如往常一样,宇扬在蛋糕上插了n支蜡烛,并把蛋糕分为 ...

  7. [转载]Invalid bound statement (not found): com.taotao.mapper.TbItemMapper.selectByExample: 错误

    因碰到同样的问题,使用该方法对我有效,为方便以后查找,所以做了转载,原文请查看:https://www.cnblogs.com/fifiyong/p/5795365.html 在Maven工程下,想通 ...

  8. C和C指针小记(九)-指针用法1

    1. *p++ 最常用的一个指针的用法,就是在循环中用来迭代. *p++ 共有3步操作: 1.++操作符把p所指向的内存中的值复制一份 2.++操作符把p加1(实际是一个p所指内存单元的大小,这也是编 ...

  9. 用homebrew 升级安装python3.7 之后系统的python版本还是旧的怎么办

    mac 中安装了多个版本的python$ brew install python3 Updating Homebrew... Warning: python is already installed, ...

  10. [administrative][CentOS] 新装系统时如何正确精准的选择基础环境和软件包

    出于不同的目的,在进行全新CentOS安装的时候,我们到底应该如何作出选择. 是mininal,base server, base web server, 还是啥? 答案在这里: https://ac ...