get first、set all策略之QWrap的Function.mul变换
get first/set all策略由jquery推出以来,很深入人心,很多享受他便利的使用者,甚至都没意识到还有这个策略的存在----大道自然啊。
它是个什么样的策略呢?
代码1(代码仅为示意,不是可执行的):
W([el1,el2]).setValue(1),
很显然,这句话会造成el1.value=1,el2.value=1。
即,操作对所有元素都有效。
对于set操作,各个框架都是一样的策略:set all。
代码2:
W([el1,el2]).getValue() 返回的是什么呢?
A: 是el1.value
B: 还是[el1.value,el2.value] ?
这两个结果,A代表的是get first;B代表的是get all。
Jquery选择了A策略,即get first,这样看起来更贴近用户的需求。
而YUI3的NodeList选用了B策略,即get all,或许他认为这样看起来语义更严谨,也或许他在实现上有顾虑。
QWrap可以无所顾虑的来决定:默认是get first策略,也可以配置成get all策略。
这是因为QWrap的思路就是:“代码”与“使用”相分离。
即,代码是一样的,但使用的是经过变换后的接口或方法。
get first、set all策略,主要通过FunctionH.mul变换来实现。
看一下mul是个什么样的方法:
mul(func, getFirst){
if(getFirst){
function findFirst(list){
Array)) {
return list;
}
){
findFirst(list[i]);
firstOne;
}
};
returnfunction(){
]);
if(firstOne){
firstOne;
,args);
}
};
}
function(){
];
Array){
[];
);
list[i];
, moreArgs);
ret.push(r);
}
{
, arguments);
}
}
(el){
(el,prop){
这里,我们需要一个NodeW的对象,(W是Wrap的缩写,为了保护core的核心,而在外面加一层Wrap,详细参见QWrap设计篇之Wrap。jquery、YUI.NodeList、YUI.Node都可以理解成一个Wrap)
function NodeW(core){
以下变换需要用到另一个变换:methodize:
function methodize(func,chain){
returnfunction(){
.core].concat([].slice.call(arguments)));
好了,以下几句话就可以做到NodeW用起来就像是一个jquery对象了
之后,我们就可以像jquery一样来这样的调用了。
全部代码如下:
mul(func, getFirst){
if(getFirst){
function findFirst(list){
Array)) {
return list;
}
){
findFirst(list[i]);
firstOne;
}
};
returnfunction(){
]);
if(firstOne){
firstOne;
,args);
}
};
}
function(){
];
Array){
[];
);
list[i];
, moreArgs);
ret.push(r);
}
{
, arguments);
}
}
methodize(func,chain){
returnfunction(){
.core].concat([].slice.call(arguments)));
(el){
(el,prop){
NodeW(core){
test(){
);
]]);