`
wmingjian
  • 浏览: 13314 次
  • 性别: 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协议细节。 ...

    log4net 日志类封装

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

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

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

    pcb封装形式图片介绍

    小型化、高频化、集成化的封装如QFN、DFN、BGA等正逐渐取代传统的封装形式,以满足更复杂、更高性能的电路需求。 总结,PCB封装形式的选择对于电子产品的设计和性能至关重要。了解并掌握各种封装的特点、尺寸、电气...

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

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

    log4cplus封装类

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

    Qt操作excel的类封装

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

    C# 海康威视 封装类 HCNetSDK

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

    C# 线性规划程序 类封装

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

    芯片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 封装”的作用 作业

    C++ rapidjson 对类序列化(完美二次封装)下载

    本工程源码,基于rapidjson实现二次封装,使C++序列化一个类的变得代码非常小,耦合性非常低,且不损失原有序列化性能。详细使用可关联本人博客:http://blog.csdn.net/lightspear/article/details/54836656

    C#串口封装类

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

    ADO C++封装类

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

Global site tag (gtag.js) - Google Analytics