Наследование в IE8
Добрый день, уважаемые форумчане.
Помогите, пожалуйста разобраться в следующей проблеме. Есть код: <!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 не выводится верный конструктор? Где ошибка в наследовании, понять не могу... |
для примера я делаю алерт:
... $.Class = function(config) { alert(config.constructor); var Class = $.extend({ constructor : function() {this.superclass.constructor()}, extend : function() {}, methods : {}, statics : {} }, config); alert(Class.constructor); ... первый алерт выведет у всех верно (хром + IE8): function() { this.isDebug = false; } однако второй алерт в хроме выведет верно function() { this.isDebug = false; } а в IE8 - нет function() {this.superclass.constructor()} |
Часовой пояс GMT +3, время: 08:40. |