tddjs > p140 each
for inの欠陥を修正した関数each tddjs.each(object, function(prop, value) { }); functionの引数 第1引数はプロパティが渡る 第2引数は値が渡る 第2引数は省略可能
by s_hiroshi
JavaScript
var tddjs = {};
tddjs.isOwnProperty = (function() {
var hasOwn = Object.prototype.hasOwnProperty;
if (typeof hasOwn == "function") {
return function(object, property) {
return hasOwn.call(object, property);
};
} else {
// Provide an emulation if you can live with possibly
// inaccurate results
}
}());
tddjs.each = (function() {
// Returns an array of properties that are not exposed
// in a for-in loop
function unEnumerated(object, properties) {
var length = properties.length;
for (var i = 0; i < length; i++) {
object[properties[i]] = true;
}
var enumerated = length;
for (var prop in object) {
if (tddjs.isOwnProperty(object, prop)) {
enumerated -= 1;
object[prop] = false;
}
}
if (!enumerated) {
return;
}
var needsFix = [];
for (i = 0; i < length; i++) {
if (object[properties[i]]) {
needsFix.push(properties[i]);
}
}
return needsFix;
}
var oFixes = unEnumerated({}, ["toString", "toLocaleString", "valueOf",
"hasOwnProperty", "isPrototypeOf",
"constructor", "propertyIsEnumerable"]);
var fFixes = unEnumerated(
function() {}, ["call", "apply", "prototype"]);
if (fFixes && oFixes) {
fFixes = oFixes.concat(fFixes);
}
var needsFix = {
"object": oFixes,
"function": fFixes
};
return function(object, callback) {
if (typeof callback != "function") {
throw new TypeError("callback is not a function");
}
// Normal loop, should expose all enumerable properties
// in conforming browsers
for (var prop in object) {
if (tddjs.isOwnProperty(object, prop)) {
...