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. 7.11python多进程

    #!/usr/bin/env python #!--*--coding:utf-8 --*-- #!@Time :2018/7/11 19:27 #!@Author TrueNewBee import ...

  2. redis(二)--用Redis作MySQL数据库缓存

    用Redis作MySQL数据库缓存,必须解决2个问题.首先,应该确定用何种数据结构存储来自mysql的数据:在确定数据结构之后,还要考虑用什么标识作为该数据结构的键. 直观上看,Mysql中的数据都是 ...

  3. 淘宝Tengine 2.1.2 稳定版(nginx/1.6.2) Centos 6.5安装教程

    淘宝Tengine 2.1.2 稳定版(nginx/1.6.2) Centos 6.5 安装教程 Tengine 简介: Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大 ...

  4. manjaro 设置 国内源

    注意,如果安装过程中出现无法连接服务,请参看第 4条. 1. 设置官方镜像源(包括 core, extra, community, multilib ) $ sudo pacman-mirrors - ...

  5. asp.net 访问页面访问统计实现

    0x00.背景: 1.用户访问网站所有页面就将访问统计数加1 ,按每月存放. 2.站点并没有用到母版面来实现,所有各个页面都很独立. 3.网站是很早这前的网站,尽量省改动以前的代码.按理说我们应该做一 ...

  6. 省一行是一行:在if语句中使用C# 7.0的模式匹配

    C# 7.0的模式匹配(Pattern Mathing)不仅可以节省代码,而且可以让代码更流畅(Fluent),今天又在实际开发中体会了一下. 不用模式匹配的代码,需要先获取返回值,然后用if进行判断 ...

  7. {Django基础十之Form和ModelForm组件}一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 ModelForm

    Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Model ...

  8. scokte tcp/ip

    import scoket# 服务端 server = socket.socket() ip_port = ("127.0.0.1",8001) server.bind(ip_po ...

  9. [No0000119]什么是柳比歇夫的时间事件记录法

    上图是我过去一年来做的时间事件记录中的某几天的记录文字.从接触到这种方法以来,也就是2009年的7月31日到今天,我已经作了一年多时间的记录.那么什么是时间事件记录?很简单,就像那两幅图片上所展示的, ...

  10. pytorch定义一个简单的神经网络

    刚学习pytorch,简单记录一下 """ test Funcition """ import torch from torch.autog ...