mass Framework classモジュールv 11
3986 ワード
mutatorsオブジェクトを削除し、その方法は$に縛られます.factoryでは、ユーザーが他の方法で定義した「クラス」を継続することをサポートします.
//=========================================
// v11 by
//==========================================
define("class", ["$lang"], function( $ ){
var
unextend = $.oneObject(["_super","prototype", 'extend', 'implement' ]),
rconst = /constructor|_init|_super/,
classOne = $.oneObject('Object,Array,Function');
function expand(klass,props){
'extend,implement'.replace( $.rword, function(name){
var modules = props[name];
if( classOne[ $.type( modules) ] ){
klass[name].apply( klass,[].concat( modules ) );
delete props[name];
}
});
return klass;
}
var hash = {
inherit : function( parent,init ) {
var bridge = function() { }
if( typeof parent == "function"){
for(var i in parent){//
this[i] = parent[i];
}
bridge.prototype = parent.prototype;
this.prototype = new bridge ;//
this._super = parent;//
if(!this._init){
this._init = [parent]
}
}
this._init = (this._init || []).concat();
if( init ){
this._init.push(init);
}
this.toString = function(){
return (init || bridge) + ""
}
var proto = this.prototype;
proto.setOptions = function(){
var first = arguments[0];
if( typeof first === "string" ){
first = this[first] || (this[first] = {});
[].splice.call( arguments, 0, 1, first );
}else{
[].unshift.call( arguments,this );
}
$.Object.merge.apply(null,arguments);
return this;
}
return proto.constructor = this;
},
implement:function(){
var target = this.prototype, reg = rconst;
for(var i = 0, module; module = arguments[i++]; ){
module = typeof module === "function" ? new module :module;
Object.keys(module).forEach(function(name){
if( !reg.test(name) ){
target[name] = module[name];
}
}, this );
}
return this;
},
extend: function(){//
var bridge = {}
for(var i = 0, module; module = arguments[i++]; ){
$.mix( bridge, module );
}
for( var key in bridge ){
if( !unextend[key] ){
this[key] = bridge[key]
}
}
return this;
}
};
$.factory = function( obj ){
obj = obj || {};
var parent = obj.inherit //
var init = obj.init ; //
delete obj.inherit;
delete obj.init;
var klass = function () {
for( var i = 0 , init ; init = klass._init[i++]; ){
init.apply(this, arguments);
}
};
$.mix( klass, hash ).inherit( parent, init );//
return expand( klass, obj ).implement( obj );
}
$.mix($.factory, hash)
return $
});