我们的Mootoolers和Prototypers(本网站上很少有人)通常带有一个方便的工具箱,我们创建(或借用)我们在本机javascript对象上实现的功能,使我们的生活更轻松一些。我希望得到一个非常有用的原型函数列表,但只有在本机对象上实现的函数(即mootools中的String.implement({...
)。
那么,你最喜欢的是什么?
PS:我把mootools和prototype包括在一起,因为为一个库编写的函数非常容易移植到另一个库中。
PPS:我知道支持/反对原型javascript对象原型的论据,我宁愿在这里避免讨论。
答案 0 :(得分:2)
我继续了tj111的开始,这是我的小补充:
Array.implement({
//calculate the sum of all integers
sum: function() {
var sum = this.reduce(function(a, b) {
return a + b;
});
return sum;
}
});
答案 1 :(得分:1)
以下是我对mootools的一些最爱。
字符串函数
String.implement({
//easy way to test if a string contains characters (input.value.isEmpty())
isEmpty : function() {
return (!this.test(/\w+/));
},
//add ellipses if string length > len
ellipse : function(len) {
return (this.length > len) ? this.substr(0, len) + "..." : this;
},
//finds all indexOf occurrences
indexesOf : function(val) {
var from = 0;
var indexes = [];
while (0 <= from && from < this.length) {
var idx = this.indexOf(val, from);
if (idx >= 0) {
indexes.push(idx);
} else {
break;
}
from = idx+1;
}
return indexes;
}
});
数组函数
Array.implement({
//compare two arrays to see if they are identical
compare : function(arr, strict) {
strict = strict || false;
if (this.length != arr.length) return false;
for (var i = 0; i < this.length; i++) {
if ($type(this[i]) == "array") {
if (!this[i].compare(arr[i])) return false;
}
if (strict) {
if (this[i] !== arr[i]) return false;
} else {
if (this[i] != arr[i]) return false;
}
}
return true;
},
//remove non-unique array values
unique : function() {
for(var i = 0; i< this.length; i++) {
var keys = this.indexesOf(this[i]);
while (keys.length > 1) {
this.splice(keys.pop(), 1);
}
}
return this;
},
//same as array.unshift, except returns array instead of count
//good for using inline... array.lpush('value').doSomethingElse()
lpush : function() {
for (var i = arguments.length -1 ; i >= 0; i--){
this.unshift(arguments[i]);
}
return this;
},
//get all indexes of an item in an array
indexesOf : function(item) {
var ret = [];
for (var i = 0; i < this.length; i++) {
if (this[i] == item) ret.push(i);
}
return ret;
}
});
答案 2 :(得分:1)
//taken from http://prototype.lighthouseapp.com/projects/8886/tickets/351-new-swap-method-for-elements
Element.addMethods({
swap: (function() {
if ('swapNode' in document.documentElement)
return function(element, other) {
return $(element).swapNode($(other));
};
return function(element, other) {
element = $(element);
other = $(other);
var next = other.nextSibling, parent = other.parentNode;
element.parentNode.replaceChild(other, element);
return parent.insertBefore(element, next);
};
})()
});
// extend the array object to support indexed insertions
// submitted at http://prototype.lighthouseapp.com/projects/8886-prototype/tickets/356-arrayinsert
Array.prototype.insert=function(element,where) {
var slice1=this.slice(0,where);
var slice2=this.slice(where);
return new Array.concat(slice1,element,slice2);
};
//extend the array object to support searching thrtough indexed arrays
// if returnIndex is true, then return the keyName, else return the value from that cell
Array.prototype.nextValue=function(startIndex,returnIndex) {
for(var i=startIndex+1;i<this.length;i++){
if(this[i]){
return (returnIndex?i:this[i]);
}
}
return null;
};
//extend the array object to support searching thrtough indexed arrays
// if returnIndex is true, then return the keyName, else return the value from that cell
Array.prototype.prevValue=function(startIndex,returnIndex) {
for(var i=startIndex-1;i>=0;i--){
if(this[i]){
return (returnIndex?i:this[i]);
}
}
return null;
};
答案 3 :(得分:1)
我还没有真正开发过Prototype和Mootools,但我想以下事情在这些框架中也会有用。
原生 Math.round()的替换,它带有指定精度的可选第二个参数:
Math.round(3.1415, 2); // 3.14
not()获取否定谓词的函数的方法:
var even = function(x){ return x % 2 === 0; };
var odd = even.not();
even(2); // true
odd(2); // false
但是大多数有用的东西是我将添加到Object.prototype的东西,如果这是一种安全的方法,那么我有一些全局函数来迭代对象属性。
objMap(),它的作用类似于Array.map(),但对象是:
// returns {a:2, b:4, c:6}
objMap({a:1, b:2, c:3}, function(value) {
return value*2;
});
objValues()和 objKeys()从对象获取属性名称或值的数组:
objValues({a:1, b:2, c:3}); // [1, 2, 3]
objKeys({a:1, b:2, c:3}); // ["a", "b", "c"]
当然 objReduce()几乎可以做任何想象......
实施细节已作为读者的练习: - )
答案 4 :(得分:1)
我喜欢在创建之前如何检查属性,以避免覆盖本机属性。
if(!Array.prototype.indexOf) {
Array.prototype.indexOf = function(){ ... };
}