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)) {
               ...