隐藏

prototype.js中class类详解

发布:2013/12/18 16:42:25作者:管理员 来源:本站 浏览次数:1568

prototype.js中class类详解

大家可以在prototype.js里看到
var Class = {
   create: function() {
     return function() {
       this.initialize.apply(this, arguments);
     }
   }
}
这种代码,相当的夸张,很多人很容易被这种bt的代码弄糊涂,其实仔细分析其中的道理却也不难

显然这种写法代表了Class是声明的一个Object对象,其中create是这个object对象的一个属性,这个属性就是一个函数。这个函数执行过后返还一个函数。可能这样解释太复杂了,那不如做一个试验好了。

<script>
var x=function(){return function(){alert(123);}}
var n=x();
n();
</script>
很好玩吧,这里n就是x函数执行过后返还给的一个函数也就是n现在等于了function(){alert(123);}再执行n()的时候就跳出了123

现在开始讲难点 this.initialize.apply(this, arguments);

这句表达了什么含义,其实现在先看看prototype.js里怎么调用的就明白了

var Template = Class.create();

Template.prototype = {
   initialize: function(template, pattern) {
     this.template = template.toString();
     this.pattern   = pattern || Template.Pattern;
   },....省略代码若干

var template = new Template(replacement);

第一句话Class.create(); 就是返还给Template 一个函数,这个函数是
function() {
       this.initialize.apply(this, arguments);
     }
当执行var template = new Template(replacement);时,就变成了要执行这个函数,而这个函数的作用是
执行当前类中initialize这个函数

所以prototype.js中的每一个类都预留了
Template.prototype = {
   initialize: function(template, pattern) {
     this.template = template.toString();
     this.pattern   = pattern || Template.Pattern;
   },....
这么个函数,如果没有这个的话,程序将会出错

知其然,知其所以然,为什么要这么写呢?

一般我们声明的时候funciton fun(){} var o=new fun();这样感觉fun又是类又是构造函数很别扭,为了分开这种不是很友好的代码方案,所以prototype.js使用了如上方法