Prototype -设计思想,代码组织形式
内容提要
阐述Prototype的代码组织形式。
代码组织形式概念
代码组织形式是指以代码以什么样的形式存在库中,存在的方式的划分标准并不是统一的。有的是指代码存在不同的文件当中从而形成的逻辑关系或者物理关系,有的是指代码是以面向对象的方式还是函数的方式存在。采取什么样的标准是以更好的阐述代码架构为前提的,在这里我使用的标准类似于函数与类的划分。
Prototype存在代码组织形式我把他划分为以下四种
对Native的扩展;
全局函数;
全局类;
全局对象;
Native
很多时候我们忘记了Javascript本身是一门语言的事实。当我们被问到Javascript是什么的时候我们通常会回答javascript能干什么,比如在页面弹出一个对话框,做一个超炫的轮播广告,自豪的说使用AJAX完成一次异步登陆。如果我是一门语言我大概不喜欢被人这样的去描述,我更希望说我有什么样的代码风格(大括号的,或者是函数式的),有什么编程特性(闭包,易变性,事件驱动),以及有哪些原生的内部实现的对象。
这两种描述的区别在于前者是把javascript放到一个具体的应用环境(浏览器)去描述,它能做什么在很大一部分程度上取决于这个具体的环境。而后者才是对javascript最真实的描述,须知javascript能做的不知是写一个轮播广告,现在Node.js让javascript 能与php,jsp,asp.net等服务端编程语言比肩。
Native是只javascript语言原生的对象,原生的类,原生的函数。它通常包括Object,Function,Date,Math,String,Number,Array等。而我们所常见的document,window,location则是浏览器创建的环境对象,不是Native的部分。
function的多面性之函数,类与对象
在javascript当中function是一个神秘的存在,你可以称它为函数,可以称它为类,也可以称它为对象,它都不介意。即使是同一个字面量,在不同的情况下你可以称之为函数,类或者对象。其实诀窍就在于它被如何使用。关于function的function是函数还是类的问题这里不做阐述。
内容主体
在prototype中最重要的编程思想是对javascript原生对象,浏览器创建的环境对象进行侵入式的扩展。使得这些对象拥有更丰富的功能,或者是通过门面模式消除javascript引擎或者浏览器之间的差异。正所谓“成也风云败也风云”,Prototype作为第一代javascript客户端库流行起来,大概也是因为对原生对象扩展所带来的方便性。它的失败也是因为随着社会化编程时代的来临,这种构造思想带来的命名冲突无法完成集体编程的使命。现在业界普遍接受的观点是不支持侵入式原生对象扩展编程,应当使用沙箱编程或者同名命名空间下的模块化编程。
被prototype扩展的原生对象包括Object,Function,Date,RegExp,String,Array,Number以及一些HTMl元素。我们在这里暂时不讨论对这些对象做了哪些扩展。这种扩展包括了两种形式,第一种是对对象的扩展,第二种是对对象的prototype属性进行扩展。
//对String“类”的静态扩展 Object.extend(String, { interpret: function (value) { return value == null ? '' : String(value); }, specialChar: { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '\\': '\\\\' } });
String.specialChar.b; //对String"类"公共函数,属性扩展 Object.extend(String.prototype, {Size:function(){return this.length}});
"licous".Size();
在这里我们都可以把String当成一个类来理解,前者是扩展的是一个类的静态函数,后者扩展的是一个类的实例函数。从调用方式的不同我们很容易看到他们的不同。
prototype没有命名空间概念的思想,除了被扩展到原生对象当中的功能之外,其他的一切功能都是以全局性“对象”完成的。这样做的弊端是可能造成命名冲突,污染命名空间。但是好处是节省了代码运行时的查找时间。
总体来说,prototype的编程思想有很强烈的单兵作战的风格,与jQuery的组队式集体作战风格截然相反。我并没有特别喜欢这两种当中的任何一种,因为我既喜欢prototype独断天下的控制感,也喜欢jQuery社会化编程带来的唾手可得的资源。