`
wmingjian
  • 浏览: 13189 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

alzui类封装的演化过程(形式化阶段)

阅读更多
1、原始的基于构造函数的类模拟方式,这是JS语法默认支持的创建类的方式

function ClassA(){
	this.a = "a";
	this.b = "a";
	this.c = "a";
	this.d = "a";
	this.e = "a";
	this.f1 = function(){};
	this.f2 = function(){};
	this.f3 = function(){};
	this.f4 = function(){};
}


2、基于原型的类模拟方式,也是JS语法默认支持的

function ClassA(){
	this.a = "a";
	this.b = "a";
	this.c = "a";
	this.d = "a";
	this.e = "a";
}
ClassA.prototype.f1 = function(){};
ClassA.prototype.f2 = function(){};
ClassA.prototype.f3 = function(){};
ClassA.prototype.f4 = function(){};


3、简化ClassA.prototype的书写,目的只是为了省键盘

function ClassA(){
	this.a = "a";
	this.b = "a";
	this.c = "a";
	this.d = "a";
	this.e = "a";
}
var _p = ClassA.prototype;  //p是prototype的首字母
_p.f1 = function(){};
_p.f2 = function(){};
_p.f3 = function(){};
_p.f4 = function(){};


4、松散的类方法定义集中到一个函数classImp中,隐藏变量_p

function ClassA(){
	this.a = "a";
	this.b = "a";
	this.c = "a";
	this.d = "a";
	this.e = "a";
}
function classImp(){
	var _p = ClassA.prototype;
	_p.f1 = function(){};
	_p.f2 = function(){};
	_p.f3 = function(){};
	_p.f4 = function(){};
}
classImp();


5、类具体实现函数classImp匿名化,取消不必要的全局变量

function ClassA(){
	this.a = "a";
	this.b = "a";
	this.c = "a";
	this.d = "a";
	this.e = "a";
}
(function(){
	var _p = ClassA.prototype;
	_p.f1 = function(){};
	_p.f2 = function(){};
	_p.f3 = function(){};
	_p.f4 = function(){};
})();


6、参数传递_p变量

function ClassA(){
	this.a = "a";
	this.b = "a";
	this.c = "a";
	this.d = "a";
	this.e = "a";
}
(function(_p){
	_p.f1 = function(){};
	_p.f2 = function(){};
	_p.f3 = function(){};
	_p.f4 = function(){};
})(ClassA.prototype);


7、引入apply,取消_p变量

function ClassA(){
	this.a = "a";
	this.b = "a";
	this.c = "a";
	this.d = "a";
	this.e = "a";
}
(function(){
	this.f1 = function(){};
	this.f2 = function(){};
	this.f3 = function(){};
	this.f4 = function(){};
}).apply(ClassA.prototype);


8、定义构造函数替代方法_init,封装属性声明代码
_init方法名字来源自java class字节码文件中每个类的构造函数的的名字都是_init
这一步里面实际的构造函数被架空,慢慢被演化为一个傀儡了:)

function ClassA(){
	this._init();
}
(function(){
	this._init = function(){
		this.a = "a";
		this.b = "a";
		this.c = "a";
		this.d = "a";
		this.e = "a";
	};
	this.f1 = function(){};
	this.f2 = function(){};
	this.f3 = function(){};
	this.f4 = function(){};
}).apply(ClassA.prototype);


9、构造函数改进,实现参数传递
这样new一个类的时候,参数能够正常传递给_init这个模拟的构造函数了

function ClassA(){
	this._init.apply(this, arguments);
}
(function(){
	this._init = function(p1, p2){
		this.a = "a";
		this.b = "a";
		this.c = "a";
		this.d = "a";
		this.e = "a";
	};
	this.f1 = function(){};
	this.f2 = function(){};
	this.f3 = function(){};
	this.f4 = function(){};
}).apply(ClassA.prototype);


10、建立基础支持代码,类形式化定义最终稳定下来

function _class(className, classImp){
	var clazz = (function(){
		return function(){
			this._init.apply(this, arguments);
		};
	})();
	window[className] = clazz;
	classImp.apply(clazz.prototype);
}
//----下面两个函数是上面的代码改进后的形式
function __newClass(){
	return function(){  //<--这就是那个傀儡!
		this._init.apply(this, arguments);
	};
}
function _class(className, classImp){
	var clazz = __newClass();
	window[className] = clazz;
	classImp.apply(clazz.prototype);
}

_class("ClassA", function(){
	this._init = function(p1, p2){
		this.a = "a";
		this.b = "a";
		this.c = "a";
		this.d = "a";
		this.e = "a";
	};
	this.f1 = function(){};
	this.f2 = function(){};
	this.f3 = function(){};
	this.f4 = function(){};
});


类形式化定义,至此完成。以后可能会提供框架代码更深层的演化细节,让大家能够更好地了解alzui框架的完整的演化过程。
分享到:
评论
5 楼 wmingjian 2010-08-17  
ymdf 写道
明鉴 能帮我看下这样封装的缺点吗?
function _class($o) {
	var _t = function() {
		this.init.apply(this, arguments);
	};
	$o ? _t.prototype = $o : false;
	return _t;
};
var myclass = _class({
	init:function(){},
	f1:function(){},
	f2:function(){},
	f3:function(){}
});

说实话,看不出来这种极简化的封装的作用
4 楼 ymdf 2010-07-21  
明鉴 能帮我看下这样封装的缺点吗?
function _class($o) {
	var _t = function() {
		this.init.apply(this, arguments);
	};
	$o ? _t.prototype = $o : false;
	return _t;
};
var myclass = _class({
	init:function(){},
	f1:function(){},
	f2:function(){},
	f3:function(){}
});
3 楼 jessige_27 2010-06-07  
wmingjian 写道
jessige_27 写道
代码里有这样一段
var clazz = (function(){
    return function(){
        this._init.apply(this, arguments);
    };
})();

实在想不通 这和下面这么写有什么区别
var clazz = function(){
    this._init.apply(this, arguments);
};


和你说的产不多,是多余的。
但是第10个步骤里面其实是两个步骤的简化,为了能够更好的理解__newClass函数的出现,这个冗余是必须的。你关注的可能只是真实的第10个步骤的代码(一个_class函数搞定类的封装),而这篇文章中隐含的第11个步骤才是这篇文章最后的结尾。


噢 标题上只有10个步骤嘛
第10步怎么会 知道第11步是什么样子 并且为之做些准备呢
被误导了 ....
2 楼 wmingjian 2010-06-06  
jessige_27 写道
代码里有这样一段
var clazz = (function(){
    return function(){
        this._init.apply(this, arguments);
    };
})();

实在想不通 这和下面这么写有什么区别
var clazz = function(){
    this._init.apply(this, arguments);
};


和你说的产不多,是多余的。
但是第10个步骤里面其实是两个步骤的简化,为了能够更好的理解__newClass函数的出现,这个冗余是必须的。你关注的可能只是真实的第10个步骤的代码(一个_class函数搞定类的封装),而这篇文章中隐含的第11个步骤才是这篇文章最后的结尾。
1 楼 jessige_27 2010-05-13  
代码里有这样一段
var clazz = (function(){
    return function(){
        this._init.apply(this, arguments);
    };
})();

实在想不通 这和下面这么写有什么区别
var clazz = function(){
    this._init.apply(this, arguments);
};

相关推荐

    序列化和反序列化的封装类

    本篇文章将深入探讨序列化和反序列化的概念,以及如何使用封装类来简化这一过程。 首先,我们需要理解什么是序列化。序列化是将一个对象的状态转换为可以存储或传输的形式,通常是XML、JSON或二进制格式。这样做的...

    声表产品封装形式尺寸图.doc

    设计师通过尺寸图可以明确了解不同封装形式的尺寸差异,从而在产品设计阶段就考虑到封装对整体布局的影响,避免因封装尺寸不合适而导致的设计更改或生产延误。 ### 四、结论 声表产品封装形式及其尺寸规格是影响其...

    IC封装过程简介

    内含集成电路封装形式、封装材料以及封装过程的一些介绍,图文并貌,是从事IC制程、IC封装行业入门级教程。

    c++ socket类封装(udp/tcp)

    本文将深入探讨C++中针对UDP(用户数据报协议)和TCP(传输控制协议)的socket类封装,这对于理解和实现网络通信非常有帮助。 首先,让我们了解什么是Socket。Socket是操作系统提供的一种接口,用于在网络中进行...

    USB HID通讯类封装

    在这个"USB HID通讯类封装"中,开发者已经创建了一个类,该类对HIDAPI的接口进行了封装,简化了与HID设备的交互过程。通过这个类,程序员可以更方便地读取和写入HID设备的数据,而无需深入理解底层的USB协议细节。 ...

    电子元件封装图 封装形式 电子 电子元件

    小外形封装(Small Outline Package,简称SO)是一种适用于集成电路的小型化封装形式,引脚分布在封装的两个长边上。 ### SSOP (Shrink Small Outline Package) 缩小型小外形封装(Shrink Small Outline Package,...

    【Dapper封装类】

    Dapper封装类,对dapper的增删查改和存储过程进行封装

    C#实现封装SPC过程能力工具类ProcessCababilityHelper

    1、直方图分组确定 2、获取子组容量 3、获取望目值 4、获取分辨率,如果返回resolution为0,则标识数组中数据均相同 5、组距,数据有误或数据均相同时返回0 6、获取组内左边界 7、获取组内右边界 ...

    log4net 日志类封装

    - **日志记录**:在封装类中,创建一个静态的 `ILog` 对象,如 `private static readonly ILog log = LogManager.GetLogger(typeof(JianKunKing.Common.Log));`,然后通过这个对象调用相应级别的方法记录日志。 ###...

    C# 海康威视 封装类 HCNetSDK

    2. **接口调用**:通过封装类提供的方法来调用HCNetSDK的原生接口,例如初始化设备、登录、获取视频流等。 3. **错误处理**:封装类通常会包含对SDK调用失败的异常处理,但开发者仍需确保在代码中添加适当的错误处理...

    Qt操作excel的类封装

    为了使用这个类封装,开发者只需实例化该类,调用相应的成员函数即可进行Excel文件的读写和高级操作,大大简化了工作流程。这个封装使得Qt应用能够轻松处理Excel数据,广泛应用于数据分析、报告生成、数据导入导出等...

    C# 线性规划程序 类封装

    根据给定的信息,本文将对"C# 线性规划程序 类...总之,通过将线性规划算法封装成 C# 类的形式,不仅提高了代码的复用性和可维护性,还使得开发人员可以更加专注于业务逻辑的设计与实现,从而提高整体项目的开发效率。

    微电子芯片层叠封装制造工艺过程的有限元模拟.pdf

    他们使用了ABAQUS软件中的单元生死技术和重启技术来实现连续工艺步骤间的无缝连接,进而分析了封装在加工工艺过程中应力分布以及翘曲的连续演化情况。通过这种模拟方法,可以预测一个工艺步骤中的应力和翘曲如何传递...

    C#串口封装类

    一个经过封装的类,封装.NET原有的Serial Port控件,拥有更加灵活的使用。

    log4cplus封装类

    1. 初始化与配置:封装类在初始化时会读取配置文件,设置Appender、Layout以及日志级别。配置文件通常采用.properties格式,可以灵活定义日志输出的路径、格式、级别等。 2. 日志级别操作:封装类会提供如debug、...

    芯片IC封装形式图片介绍大全.pdf

    芯片IC封装形式是将半导体集成电路芯片固定在特定的载体上,并通过一系列工艺实现电气连接,封装的目的是为了保护芯片、提供...随着电子技术的发展,封装形式也在不断演化,以适应更高性能、更小型化和更低功耗的需求。

    httpclient4.3 封装工具类

    6. **异常处理**:为了提高代码的健壮性,封装工具类会添加异常处理机制,当HTTP请求过程中出现错误时,能抛出易于理解和处理的异常,如网络连接错误、超时错误等。 7. **连接管理和配置**:HttpClient允许自定义...

    [VB]一个Socket连接类,封装了Winsock API

    在VB中,直接使用Winsock API可能会较为复杂,因此通常会将其封装成一个类,简化调用过程。 这个名为"一个Socket连接类,封装了Winsock API"的VB类,可能包含以下核心功能: 1. 初始化与配置:类的初始化通常涉及...

    c++类的封装教程类的封装

    从“结构”到“类” 类的成员数据与成员函数 成员数据初始化的疑问 成员函数的实现 封装 私有成员/private member 保护成员/protected member 公有成员/public member 封装”的作用 作业

    ADO C++封装类

    - 头文件中的使用说明可能包含了如何实例化封装类,如何调用成员方法,以及如何处理返回的Recordset对象等信息。例如,如何打开连接: ```cpp MyADOCPPWrapper wrapper; wrapper.OpenConnection("DSN=...

Global site tag (gtag.js) - Google Analytics