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(0, 10).include(10)
// 返回true
$A($R(0, 5)).join(‘, ’)
// 返回 ’0, 1, 2, 3, 4, 5′
$A($R(‘aa’, ‘ah’)).join(‘, ’)
// 返回 ’aa, ab, ac, ad, ae, af, ag, ah’
$R(0, 10, true).include(10)
// 返回 false
$R(0, 10, true).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的一个简短别名。 |
这个相对用的多点