WEB开发网
开发学院网页设计JavaScript 浅谈JavaScript框架设计 阅读

浅谈JavaScript框架设计

 2010-09-14 13:27:52 来源:WEB开发网   
核心提示: 直接修改prototype看上去非常诱人,但是在考虑它之前应当先考虑两种可能的方案:(1)函数提供一个以对象为第一个参数的函数比如 Array.prototype.each =>function ForEach(arr,f){if(arr instanceof Array)/*...

直接修改prototype看上去非常诱人,但是在考虑它之前应当先考虑两种可能的方案:

(1)函数

提供一个以对象为第一个参数的函数比如 Array.prototype.each =>

    function ForEach(arr,f)
    {
      if(arr instanceof Array)/*...*/;
    }

(2)继承

    以return的形式继承一个内置对象 比如考虑Array.prototype.each=>
    function ArrayCollection()
    {
      var r=Array.apply(this,arguments);
      r.each=function(){/*......*/};
      return r;
    }

套用一句名言,不要修改原生对象的prototype,除非你认为必要。不过修改原生对象的prototype确实有一些特殊的用途(就是"必要的情况"),主要体现在2点:文字量支持和链式表达。举一个例子可以体现这两点:

var cf=function f(a,b,c,d)
{
/*........*/
}.$curry(3,4).$curry(5).$run();

如果希望实现类似上面的表达方式,可能就需要扩展Function.prototype,权衡一下的话,如果你认为命名污染的代价是值得的,那么也是可以提供给使用者的。

一个比较讨巧的办法是把选择权利交给使用者,提供一个扩展器:

function FunctionExtend()
{
  this.$curry=function(){/*......*/};
  this.$run=function(){/*......*/};
}

如果用户喜欢可以FunctionExtend.apply(Function.prototype); 如果不喜欢扩展 则可以

  var r=function(){/*......*/};
  FunctionExtend.apply(r);

3.保持和原生对象的一致

不知你有没有注意到,内置对象Function Array等都有这样的性质:

new Function()跟Function的结果完全一致(String Number Boolean这种封装型对象没有这样的性质)

如果框架中提供的类也具有这种性质,会是不错的选择。这仅仅是一个例子,如果你注意到了其他细节,并且让框架中的类和原生对象保持一致,对使用者来说是非常有益的。

4.尊重语言 尊重用户

编写框架应该尊重依赖的语言环境,在对原有的元素修改之前,首先应该考虑到原来的合理性,任何语言的原生环境提供的都是经过了精心设计的,在任何修改之前,至少应该考虑这几点:效率、命名规范、必要性、与其他功能是否重复。如果你没有付出至少跟语言的设计者相当的工作量,你的做法就是欠考虑的。

编写框架也应该尊重用户的所有习惯,将编写者的喜好强加给使用者并不是框架应该做的事情。框架应该保证大部分在没有框架环境下能运行的代码都能在框架下正常工作,这样用户不必为了使用你的框架而修改原有的代码。

5.规范命名和使用命名空间

减少命名污染可以让你的框架跟其他框架更好地共存。很多框架使用了命名空间来管理,这是良好的设计。命名应该是清晰且有实际意义的英文单词,如前面3所述,为了保持和原生对象的一致,命名规则最好贴近原生对象,比如类名第一字母大写,方法名用驼峰命名。捎带一提prototype中的$实在是非常糟糕的设计,无法想象$出现的目的仅仅是为了让使用者少写几个字母。这种事情应该交给你的用户在局部代码中使用。

上一页  1 2 3 4 

Tags:JavaScript 框架 设计

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接