这是我第二次针对甘露模型做专题了。这一次是基于最新版本的甘露模型做设计模式的探讨实现。
开篇之前,先说几句废话:
javascript运行于浏览器之上,而设计模式一般是在大型项目中才有用武之地,这二者一结合,也便产生了一个中心,两个基本点。
所谓 一个中心:稳定运行,性能至上。
浏览器上面运行的程序,想要做大一点的项目,首先是要过性能这一关。而甘露模型实现了完美的内存资源节约和性能优化,是架构核心的不二之选。
所谓 两个基本点:1,架构清晰; 2,易于扩展;
基于甘露模型本身的面向对象思想,完全可以用来实现GOF23,所以,在架构和扩展上既然有了设计模式做铺垫,也就不必担心什么大问题了。
代码的例子描述来自 terrylee 的装饰模式C#版本, http://terrylee.cnblogs.com/archive/2006/03/01/340592.html
关于装饰模式的详细解释,请看 terrylee 的装饰模式C#版本,这里我就不多详解了。
废话完毕,直接上代码:
//============甘露模型开始 =================================
//定义类的语法甘露:Class() //最后一个参数是JSON表示的类定义 //如果参数数量大于1个,则第一个参数是基类 //第一个和最后一个之间参数,将来可表示类实现的接口 //返回值是类,类是一个构造函数 function Class() { var aDefine = arguments[arguments.length - 1]; //最后一个参数是类定义 if (!aDefine) return; var aBase = arguments.length > 1 ? arguments[0] : object; //解析基类 function prototype_() { }; //构造prototype的临时函数,用于挂接原型链 prototype_.prototype = aBase.prototype; //准备传递prototype var aPrototype = new prototype_(); //建立类要用的prototype for (var member in aDefine) //复制类定义到当前类的prototype if (member != "Create") //构造函数不用复制 aPrototype[member] = aDefine[member]; //根据是否继承特殊属性和性能情况,可分别注释掉下列的语句 if (aDefine.toString != Object.prototype.toString) aPrototype.toString = aDefine.toString; if (aDefine.toLocaleString != Object.prototype.toLocaleString) aPrototype.toLocaleString = aDefine.toLocaleString; if (aDefine.valueOf != Object.prototype.valueOf) aPrototype.valueOf = aDefine.valueOf; if (aDefine.Create) //若有构造函数 var aType = aDefine.Create //类型即为该构造函数 else //否则为默认构造函数 aType = function() { this.base.apply(this, arguments); //调用基类构造函数 }; aType.prototype = aPrototype; //设置类(构造函数)的prototype aType.Base = aBase; //设置类型关系,便于追溯继承关系 aType.prototype.Type = aType; //为本类对象扩展一个Type属性 return aType; //返回构造函数作为类 }; //根类object定义: function object() { } //定义小写的object根类,用于实现最基础的方法等 object.prototype.isA = function(aType) //判断对象是否属于某类型 { var self = this.Type; while (self) { if (self == aType) return true; self = self.Base; }; return false; }; object.prototype.base = function() //调用基类构造函数 { var Base = this.Type.Base; //获取当前对象的基类 if (!Base.Base) //若基类已没有基类 Base.apply(this, arguments) //则直接调用基类构造函数 else //若基类还有基类 { this.base = MakeBase(Base); //先覆写this.base Base.apply(this, arguments); //再调用基类构造函数 delete this.base; //删除覆写的base属性 }; function MakeBase(Type) //包装基类构造函数 { var Base = Type.Base; if (!Base.Base) return Base; //基类已无基类,就无需包装 return function() //包装为引用临时变量Base的闭包函数 { this.base = MakeBase(Base); //先覆写this.base Base.apply(this, arguments); //再调用基类构造函数 }; }; };
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, function
, this
, prototype
, 径向基函数
, base
arguments
甘露模型、3d装饰画模型、中国传统装饰柱 模型、r语言 garch模型实现、基本模型机设计与实现,以便于您获取更多的相关知识。