Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.05.2012, 10:01
Новичок на форуме
Отправить личное сообщение для Евгений Злобин Посмотреть профиль Найти все сообщения от Евгений Злобин
 
Регистрация: 22.05.2012
Сообщений: 2

Наследование в 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 не выводится верный конструктор? Где ошибка в наследовании, понять не могу...

Последний раз редактировалось Евгений Злобин, 22.05.2012 в 10:05.
Ответить с цитированием
  #2 (permalink)  
Старый 22.05.2012, 10:13
Новичок на форуме
Отправить личное сообщение для Евгений Злобин Посмотреть профиль Найти все сообщения от Евгений Злобин
 
Регистрация: 22.05.2012
Сообщений: 2

для примера я делаю алерт:

...
$.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()}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ExtJS theming в IE8!? JDev ExtJS 0 05.01.2012 15:56
window.resizeTo(w,h) в ie8 задёт не те размеры. mister_maxim Internet Explorer 1 29.07.2011 22:51
Как отключить режим совместимости в IE8? kidar2 Internet Explorer 2 25.06.2011 16:45
<= IE8 memory leak, IE9 - fine AbNormy Internet Explorer 1 20.05.2011 19:47
Как обработать изменение масштаба окна в IE8 ? v_k Events/DOM/Window 1 09.08.2010 13:35