别人是说了再做,我是做了再说;别人说了不一定做,我是做了不一定说。

PROTOTYPE使用手记

Try.these(Function…) -> firstOKResult

 

 

接受任意数量的函数(注:即函数引用),返回第一个没有异常抛出的函数返回值。

这个方法提供了一个简单的方法,用来顺序地尝试执行许多代码块。这样一个尝试队列,通常表现为一个让步函数来获得指定的结果。

在下面一个来自于Prototype的Ajax库的例子中,我们想要获得XMLHttpRequet对象。然而,IE6或者更早版本,并不提供一个原生的Javascript对象,如果我们尝试去实例化,那么就会抛出一个异常。并且,经过一段时间,这样的私有方法也得到了改进,也就是改变了COM接口的名字。

Try.these 将顺序地尝试这些方法,从最好的(理论上的,最普遍的)到最陈旧的和最少用的方法,然后返回第一个成功执行的函数的返回值。

如果没有一个代码块成功,Try.these会返回一个undefined。比如在下面例子中,会造成getTransport方法返回false,如同提供了一个可靠的返回值。

getTransport: function() {

  return Try.these(

    function() { return new XMLHttpRequest() },

    function() { return new ActiveXObject(‘Msxml2.XMLHTTP’) },

    function() { return new ActiveXObject(‘Microsoft.XMLHTTP’) }

  ) || false;

}

 

document.getElementsByClassName(className[, element]) -> [HTMLElement…]

 

 

找到(和提供)所有CSS类名为className的元素。可选的元素参数用来指定其在一个父元素里进行搜索。

 

注意:每一个返回的元素都已经被扩展了。

例子

HTML:

  <body>

    <div id=”one” class=”foo”>Single class name</div>

    <div id=”two” class=”foo bar thud”>Multiple class names</div>

    <ul id=”list”>

      <li id=”item_one” class=”thud”>List item 1</li>

      <li>List item 2</li>

      <li id=”item_two” class=”thud”>List item 3</li>

    </ul>

  </body>

JavaScript:

  document.getElementsByClassName(‘foo’);

  // 返回 [HTMLElement, HTMLElement] (div#one, div#two)

  document.getElementsByClassName(‘thud’);

  // 返回 [HTMLElement, HTMLElement, HTMLElement] (div#two, li#item_one, li#item_two);

  document.getElementsByClassName(‘thud’, $(‘list’));

  // 返回 [HTMLElement, HTMLElement] (li#item_one, li#item_two)

 

$w(String) -> Array

 

 

用所有空格作为定界符,把一个字符串分割成一个数组。等同于Ruby的%w(foo bar或者Perl的qw(foo bar)。(注:当然,也可以理解为是String.prototype.split(’ ‘)的一个封装)

This is one of those life-savers for people who just hate commas in literal arrays :-)(注:调侃的话,不知道如何翻译妥当:-(

Examples

$w(‘apples bananas kiwis’)

// -> [’apples’, ’bananas’, ’kiwis’]

它可以在书写简单的迭代器时轻松的缩短代码:

$w(‘apples bananas kiwis’).each(function(fruit){

  var message = ‘I like ’ + fruit

  // do something with the message

})

而且,在集合元素函数时,也会变成一道美味的甜点:

$w(’ads navbar funkyLinks’).each(Element.hide);

 

$R(start, end[, exclusive = false]) -> ObjectRange创建一个新的ObjectRange对象。这个方法是ObjectRange构造器一个方便的封装,但$R是不错的别名

ObjectRange 实例描绘一个相邻值的排列,无论是数字的,文本的还是任何在语法上支持值排列的。查看类型文档以得到更多的细节,然后找出怎样才能使你自己的对象支持值排列。

$R函数需要和原构造器一模一样的参数:下限和上限(相同正确类型的值),以及上限是否除外。默认情况下,上限是包含进去的。

例子

$R(010).include(10)

// 返回true

$A($R(05)).join(‘, ’)

// 返回 ’0, 1, 2, 3, 4, 5′

$A($R(‘aa’‘ah’)).join(‘, ’)

// 返回 ’aa, ab, ac, ad, ae, af, ag, ah’

$R(010true).include(10)

// 返回 false

$R(010true).each(function(value) {

  // 调用了10次相当于value从0到9的循环

});

注意,ObjectRange是混合枚举模块的:这会使得它容易把排列转换成一个数组(枚举提供一个toArray方法,它使得$A转换函数直接了当),或者用值去迭代。

注意

不过,用start和end属性来获取范围会比调用min()和max()方法来得高效。(注:即$R(0,10).start,$R(0,10).end

 

$H([obj]) -> EnumerableHash

 

 

获得一个Hash(等同于映射或联合数组)的唯一方法。返回一个拥有Hash和枚举模块方法的新对象。如果传递一个原对象,那么会在和上述模块混合之前克隆它自身所有的属性。

$H方法是获得一个Hash唯一正确的方法。

事实上,Hash是一个模块,它并不是加入Prototype类机制的一个类。使用new Hash()并不会有任何帮助,反而会引起一个构造器错误。

Hash模块被设计成与混合了枚举模块的对象进行混合,所以$H函数可以保证会提供给你一个混合了上述两者的一个对象。

你可以调用无参数的$H():这样可以获得一个空Hash(一个只拥有混合模块方法的Hash)。如果你传递给它一个参数,它就会在混合模块之前克隆出传递过去的对象。任何来自对象的属性如果和模块里的方法冲突,那么就会被删除掉。

当前,有一个未发布的补丁,用于提供安全的Hash。也就是hash可以用任何的键名,除了那些有风险的冲突或者语法限制的名称。本页面之后会有更新。

 

$F(element) -> value
返回一个表单控件的值。它是Form.Element.getValue的一个简短别名。

这个相对用的多点

 

 

 

 

posted @ 2008-08-31 09:29  碧血黄沙-java、c#  阅读(632)  评论(0编辑  收藏  举报