一个Javascript框架,没有一个设计合理的面向对象继承机制可是不行的哦,让我们先看看JS那独特的OOP方式!

如今面向对象的JS继承机制五花八门。各大框架都有自己独特的设计方案,但最基本的原理都大致属于原型继承机制。让我们来看段代码:

Class = function(){
this.name = 'classname';
this.result = 'nam';
};
Class.prototype
= {
init :
function(){},
setName :
function(){},
getResult :
function(){}
};

    以上定义一个典型的原型类,使用构造器函数来实例化一个对象,即new,注意new Class() 和 Class() 执行效果是完全不一样的,大家可以思考下其中的差异。当定义一个子类要继承它时,直接 SubClass.prototype = new Class(); 即可,这种方法使用方便而且原型方法不会被反复定义,Prototype库的继承方法强制实行了一个initialize,作为默认构造器。并引入了super指向父类的引用,Extjs更甚,直接引入组件化的方式,单纯的类在Ext中作用不大。

    它们都有一个缺点,即没有私有变量!原型中的属性可以随意修改。现在有一种模块化的实行方法,代码如下:

Model = function(){
var name = 'classname';
var result = 'nam';
return {
setName :
function(){},
getResult :
function(){}
}
};

实例化对象时不能用new运算符,只能用函数调用方式,其中name,result对于两个方法来说属于闭包变量,因此它们都是私有变量,有一些功能性模块也一般采用这种方式来对外定义接口,区别就是在函数最后加上一个()来立即执行,这样Model在代码加载完毕时就等于return中对象字面量中的Object。

    这种方式也有缺点,就是很难定义原型方法,每次实例化对象时都会反复执行return中的代码,前面所说的强制构造方法的实现方法如下:

Class = function(classname, classImpl, superClass){
var _super = Object,
clazz
= function(){
this.init.apply(this, arguments);// init是要求强制定义的初始化方法,用来构造对象
};
if(superClass){
clazz.prototype
= new superClass();
_super
= superClass.prototype;
}
clazz.prototype.super
= _super;
HL.append(clazz.prototype, classImpl);
// 复制属性的公共方法
window[classname] = clazz;
};

以上是一个新建类的公共方法,三个参数分别是1)类名称 2)类代码块 3)父类,下面是实例

Class('Human', {
name :
'null',
init :
function(a, s){
var age = a;
var sex = s;
this.setAge = function(a){
age
= a;
};
this.setSex = function(s){
sex
= s;
};
this.getAge = function(){
return age;
};
this.getSex = function(){
return sex;
};
},
showName :
function(){
return this.name;
}
});

var chinese = new Human(21, 'male');

Class(
'Man', {
children : [],
init :
function(age){
this.super.init.call(this, age, 'male');
},
setName :
function(name){
this.name = name;
}
}, Human);

chinese
= new Man(26);

init方法是强制要求定义的初始化构造函数,关于私有变量的问题......只能是在init函数中定义局部变量并且定义特权函数,因为不是原型方法所以每次实例化新对象都会有额外的内存开销了。这种兼顾原型方法和私有变量的方案现在测试倒是没什么问题,咳继续研究也没意义,都是很纠结的事情。以上代码实现思路主要来自Prototype framework 和这篇博客内的观点:http://www.cnblogs.com/snandy/archive/2011/04/18/2020066.html#2090011

OK,框架已经有了一个基本像样的类定义方法 和 继承机制,框架开始初步雏形,下一期我们开始尝试简单的UI组件吧