Добрый день, уважаемые форумчане.
Помогите, пожалуйста разобраться в следующей проблеме.
Есть код:
<!DOCTYPE html>
<html>
<head>
<script src="//yandex.st/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
<div id="log"></div>
<script>
jQuery(function() {
$.Class = function(config) {
var Class = $.extend({
constructor : function() {this.superclass.constructor()},
extend : function() {},
methods : {},
statics : {}
}, config);
var constructor = Class.constructor;
var superclass = Class.extend;
var methods = Class.methods;
var statics = Class.statics;
var Empty = function() {};
Empty.prototype = superclass.prototype;
var proto = new Empty();
var metaDataClass;
var defineMetaDataClass = function() {
proto.__META_DATA_CLASS__ = {
constructor : {}
};
return proto.__META_DATA_CLASS__;
};
if (constructor instanceof Array) {
var constrArr = constructor;
constructor = function() {
this.__META_DATA_CLASS__.
constructor[arguments.length].apply(this, arguments);
};
metaDataClass = defineMetaDataClass();
for (var i = 0;i < constrArr.length;++i) {
metaDataClass.constructor[constrArr[i].length] = constrArr[i];
}
}
var defineMethods = function(conf) {
defineAbstractProperty(conf, 'methods', proto);
};
var defineStatics = function(conf) {
defineAbstractProperty(conf, 'static', constructor);
}
var defineAbstractProperty = function(conf, propertyName, target) {
proto.__META_DATA_CLASS__[propertyName] = {};
var metaData = proto.__META_DATA_CLASS__[propertyName];
for (var prop in conf) {
if (conf[prop] instanceof Function) {
target[prop] = conf[prop];
} else if (conf[prop] instanceof Array) {
var methodName = prop;
target[methodName] = function() {
return metaData[methodName][arguments.length].apply(this, arguments);
}
metaData[methodName] = {};
for (var i = 0;i < conf[methodName].length;++i) {
metaData[methodName][conf[methodName][i].length] = conf[methodName][i];
}
}
}
};
if (!proto.__META_DATA_CLASS__) {
defineMetaDataClass();
}
defineMethods(methods);
proto.constructor = constructor;
proto.superclass = superclass.prototype;
constructor.prototype = proto;
defineStatics(statics);
return constructor;
};
$.Object = new $.Class({
constructor : function() {
this.isDebug = false;
},
extend : Object,
methods : {},
statics : {}
});
object1 = new $.Object();
var printObj = function(obj) {
var arr = [];
$.each(obj, function(key, val) {
var next = key + ": ";
next += $.isPlainObject(val) ? printObj(val) : val;
arr.push( next );
});
return "{ " + arr.join(", ") + " }<br>";
};
$("#log").append( printObj(object1) );
});
</script>
</body>
</html>
что должно давать на выводе:
{ isDebug: false, __META_DATA_CLASS__: { constructor: { }
, methods: { }
, static: { }
}
, constructor: function () { this.isDebug = false; }, superclass: { }
}
это то,что показывает хром (верно)
{ __META_DATA_CLASS__: { methods: { }
, static: { }
}
, superclass: { }
}
это то, что показывает IE8 (не верно)
почему для объекта класса $.Object не выводится верный конструктор? Где ошибка в наследовании, понять не могу...