像这种超级复杂结构的JS,该用什么编辑器才能理清头绪var Native=function(options){options=options||{};var name=options.name;var legacy=options.legacy;var protect=options.protect;var methods=options.implement;var generics=options.generics;var initialize=options.initialize;var afterImplement=options.afterImplement||function(){};var object=initialize||legacy;generics=generics!==false;object.constructor=Native;object.$family={name:'native'};if(legacy&&initialize)object.prototype=legacy.prototype;object.prototype.constructor=object;if(name){var family=name.toLowerCase();object.prototype.$family={name:family};Native.typize(object,family);}
var add=function(obj,name,method,force){if(!protect||force||!obj.prototype[name])obj.prototype[name]=method;if(generics)Native.genericize(obj,name,protect);afterImplement.call(obj,name,method);return obj;};object.alias=function(a1,a2,a3){if(typeof a1=='string'){if((a1=this.prototype[a1]))return add(this,a2,a1,a3);}
for(var a in a1)this.alias(a,a1[a],a2);return this;};object.implement=function(a1,a2,a3){if(typeof a1=='string')return add(this,a1,a2,a3);for(var p in a1)add(this,p,a1[p],a2);return this;};if(methods)object.implement(methods);return object;};Native.genericize=function(object,property,check){if((!check||!object[property])&&typeof object.prototype[property]=='function')object[property]=function(){var args=Array.prototype.slice.call(arguments);return object.prototype[property].apply(args.shift(),args);};};Native.implement=function(objects,properties){for(var i=0,l=objects.length;i<l;i++)objects[i].implement(properties);};Native.typize=function(object,family){if(!object.type)object.type=function(item){return($type(item)===family);};};(function(){var natives={'Array':Array,'Date':Date,'Function':Function,'Number':Number,'RegExp':RegExp,'String':String};for(var n in natives)new Native({name:n,initialize:natives[n],protect:true});var types={'boolean':Boolean,'native':Native,'object':Object};for(var t in types)Native.typize(types[t],t);var generics={'Array':["concat","indexOf","join","lastIndexOf","pop","push","reverse","shift","slice","sort","splice","toString","unshift","valueOf"],'String':["charAt","charCodeAt","concat","indexOf","lastIndexOf","match","replace","search","slice","split","substr","substring","toLowerCase","toUpperCase","valueOf"]};for(var g in generics){for(var i=generics[g].length;i--;)Native.genericize(window[g],generics[g][i],true);}})();var Hash=new Native({name:'Hash',initialize:function(object){if($type(object)=='hash')object=$unlink(object.getClean());for(var key in object)this[key]=object[key];return this;}});Hash.implement({forEach:function(fn,bind){for(var key in this){if(this.hasOwnProperty(key))fn.call(bind,this[key],key,this);}},getClean:function(){var clean={};for(var key in this){if(this.hasOwnProperty(key))clean[key]=this[key];}
return clean;},getLength:function(){var length=0;for(var key in this){if(this.hasOwnProperty(key))length++;}
return length;}});Hash.alias('forEach','each');Array.implement({forEach:function(fn,bind){for(var i=0,l=this.length;i<l;i++)fn.call(bind,this[i],i,this);}});Array.alias('forEach','each');function $A(iterable){if(iterable.item){var l=iterable.length,array=new Array(l);while(l--)array[l]=iterable[l];return array;}
return Array.prototype.slice.call(iterable);};function $arguments(i){return function(){return arguments[i];};};function $chk(obj){return!!(obj||obj===0);};function $clear(timer){clearTimeout(timer);clearInterval(timer);return null;};function $defined(obj){return(obj!=undefined);};function $each(iterable,fn,bind){var type=$type(iterable);((type=='arguments'||type=='collection'||type=='array')?Array:Hash).each(iterable,fn,bind);};function $empty(){};function $extend(original,extended){for(var key in(extended||{}))original[key]=extended[key];return original;};function $H(object){return new Hash(object);};function $lambda(value){return(typeof value=='function')?value:function(){return value;};};function $merge(){var args=Array.slice(arguments);args.unshift({});return $mixin.apply(null,args);};function $mixin(mix){for(var i=1,l=arguments.length;i<l;i++){var object=arguments[i];if($type(object)!='object')continue;for(var key in object){var op=object[key],mp=mix[key];mix[key]=(mp&&$type(op)=='object'&&$type(mp)=='object')?$mixin(mp,op):$unlink(op);}}
return mix;};function $pick(){for(var i=0,l=arguments.length;i<l;i++){if(arguments[i]!=undefined)return arguments[i];}
return null;};function $random(min,max){return Math.floor(Math.random()*(max-min+1)+min);};function $splat(obj){var type=$type(obj);return(type)?((type!='array'&&type!='arguments')?[obj]:obj):[];};var $time=Date.now||function(){return+new Date;};function $try(){for(var i=0,l=arguments.length;i<l;i++){try{return arguments[i]();}catch(e){}}
return null;};function $type(obj){if(obj==undefined)return false;if(obj.$family)return(obj.$family.name=='number'&&!isFinite(obj))?false:obj.$family.name;if(obj.nodeName){switch(obj.nodeType){case 1:return'element';case 3:return(/\S/).test(obj.nodeValue)?'textnode':'whitespace';}}else if(typeof obj.length=='number'){if(obj.callee)return'arguments';else if(obj.item)return'collection';}
return typeof obj;};function $unlink(object){var unlinked;switch($type(object)){case'object':unlinked={};for(var p in object)unlinked[p]=$unlink(object[p]);break;case'hash':unlinked=new Hash(object);break;case'array':unlinked=[];for(var i=0,l=object.length;i<l;i++)unlinked[i]=$unlink(object[i]);break;default:return object;}

解决方案 »

  1.   

    自己先格式化一下再说,可是试一试Aptana。
      

  2.   


    var Native = function(options) {
        options = options || {};
        var name = options.name;
        var legacy = options.legacy;
        var protect = options.protect;
        var methods = options.implement;
        var generics = options.generics;
        var initialize = options.initialize;
        var afterImplement = options.afterImplement ||
        function() {};
        var object = initialize || legacy;
        generics = generics !== false;
        object.constructor = Native;
        object.$family = {
            name: 'native'
        };
        if (legacy && initialize) object.prototype = legacy.prototype;
        object.prototype.constructor = object;
        if (name) {
            var family = name.toLowerCase();
            object.prototype.$family = {
                name: family
            };
            Native.typize(object, family);
        }
        var add = function(obj, name, method, force) {
            if (!protect || force || !obj.prototype[name]) obj.prototype[name] = method;
            if (generics) Native.genericize(obj, name, protect);
            afterImplement.call(obj, name, method);
            return obj;
        };
        object.alias = function(a1, a2, a3) {
            if (typeof a1 == 'string') {
                if ((a1 = this.prototype[a1])) return add(this, a2, a1, a3);
            }
            for (var a in a1) this.alias(a, a1[a], a2);
            return this;
        };
        object.implement = function(a1, a2, a3) {
            if (typeof a1 == 'string') return add(this, a1, a2, a3);
            for (var p in a1) add(this, p, a1[p], a2);
            return this;
        };
        if (methods) object.implement(methods);
        return object;
    };
    Native.genericize = function(object, property, check) {
        if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function() {
            var args = Array.prototype.slice.call(arguments);
            return object.prototype[property].apply(args.shift(), args);
        };
    };
    Native.implement = function(objects, properties) {
        for (var i = 0,
        l = objects.length; i < l; i++) objects[i].implement(properties);
    };
    Native.typize = function(object, family) {
        if (!object.type) object.type = function(item) {
            return ($type(item) === family);
        };
    }; (function() {
        var natives = {
            'Array': Array,
            'Date': Date,
            'Function': Function,
            'Number': Number,
            'RegExp': RegExp,
            'String': String
        };
        for (var n in natives) new Native({
            name: n,
            initialize: natives[n],
            protect: true
        });
        var types = {
            'boolean': Boolean,
            'native': Native,
            'object': Object
        };
        for (var t in types) Native.typize(types[t], t);
        var generics = {
            'Array': ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"],
            'String': ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"]
        };
        for (var g in generics) {
            for (var i = generics[g].length; i--;) Native.genericize(window[g], generics[g][i], true);
        }
    })();
    var Hash = new Native({
        name: 'Hash',
        initialize: function(object) {
            if ($type(object) == 'hash') object = $unlink(object.getClean());
            for (var key in object) this[key] = object[key];
            return this;
        }
    });
    Hash.implement({
        forEach: function(fn, bind) {
            for (var key in this) {
                if (this.hasOwnProperty(key)) fn.call(bind, this[key], key, this);
            }
        },
        getClean: function() {
            var clean = {};
            for (var key in this) {
                if (this.hasOwnProperty(key)) clean[key] = this[key];
            }
            return clean;
        },
        getLength: function() {
            var length = 0;
            for (var key in this) {
                if (this.hasOwnProperty(key)) length++;
            }
            return length;
        }
    });
    Hash.alias('forEach', 'each');
    Array.implement({
        forEach: function(fn, bind) {
            for (var i = 0,
            l = this.length; i < l; i++) fn.call(bind, this[i], i, this);
        }
    });
    Array.alias('forEach', 'each');
    function $A(iterable) {
        if (iterable.item) {
            var l = iterable.length,
            array = new Array(l);
            while (l--) array[l] = iterable[l];
            return array;
        }
        return Array.prototype.slice.call(iterable);
    };
    function $arguments(i) {
        return function() {
            return arguments[i];
        };
    };
    function $chk(obj) {
        return !! (obj || obj === 0);
    };
    function $clear(timer) {
        clearTimeout(timer);
        clearInterval(timer);
        return null;
    };
    function $defined(obj) {
        return (obj != undefined);
    };
    function $each(iterable, fn, bind) {
        var type = $type(iterable); ((type == 'arguments' || type == 'collection' || type == 'array') ? Array: Hash).each(iterable, fn, bind);
    };
    function $empty() {};
    function $extend(original, extended) {
        for (var key in (extended || {})) original[key] = extended[key];
        return original;
    };
    function $H(object) {
        return new Hash(object);
    };
    function $lambda(value) {
        return (typeof value == 'function') ? value: function() {
            return value;
        };
    };
    function $merge() {
        var args = Array.slice(arguments);
        args.unshift({});
        return $mixin.apply(null, args);
    };
    function $mixin(mix) {
        for (var i = 1,
        l = arguments.length; i < l; i++) {
            var object = arguments[i];
            if ($type(object) != 'object') continue;
            for (var key in object) {
                var op = object[key],
                mp = mix[key];
                mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $mixin(mp, op) : $unlink(op);
            }
        }
        return mix;
    };
    function $pick() {
        for (var i = 0,
        l = arguments.length; i < l; i++) {
            if (arguments[i] != undefined) return arguments[i];
        }
        return null;
    };
    function $random(min, max) {
        return Math.floor(Math.random() * (max - min + 1) + min);
    };
    function $splat(obj) {
        var type = $type(obj);
        return (type) ? ((type != 'array' && type != 'arguments') ? [obj] : obj) : [];
    };
    var $time = Date.now ||
    function() {
        return + new Date;
    };
    function $try() {
        for (var i = 0,
        l = arguments.length; i < l; i++) {
            try {
                return arguments[i]();
            } catch(e) {}
        }
        return null;
    };
    function $type(obj) {
        if (obj == undefined) return false;
        if (obj.$family) return (obj.$family.name == 'number' && !isFinite(obj)) ? false: obj.$family.name;
        if (obj.nodeName) {
            switch (obj.nodeType) {
            case 1:
                return 'element';
            case 3:
                return (/\S/).test(obj.nodeValue) ? 'textnode': 'whitespace';
            }
        } else if (typeof obj.length == 'number') {
            if (obj.callee) return 'arguments';
            else if (obj.item) return 'collection';
        }
        return typeof obj;
    };
    function $unlink(object) {
        var unlinked;
        switch ($type(object)) {
        case 'object':
            unlinked = {};
            for (var p in object) unlinked[p] = $unlink(object[p]);
            break;
        case 'hash':
            unlinked = new Hash(object);
            break;
        case 'array':
            unlinked = [];
            for (var i = 0,
            l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]);
            break;
        default:
            return object;
        }格式化工具:http://tool.chinaz.com/Tools/JsFormat.aspx
      

  3.   


    晕 你这个是mootools的源码啊 你直接下载非压缩版的看啊
      

  4.   

    只是压缩了,又没有混淆,还是很好办的。Aptana或者Eclipse+Webtools就可以格式化了
      

  5.   

    你去mootools官方网站下载未压缩的版本就可以了。还带英文注释的
      

  6.   

    经过压缩之后的... and up and study