Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: наследование в JS
 
 автор: sl1p   (29.07.2012 в 15:32)   письмо автору
 
 

есть некий плагин, который реализует "ооп" на жс.

(function($){
    
    var initializing = false,
    fnTest = /xyz/.test(function(){
        xyz;
    }) ? /\b_super\b/ : /.*/;

    jQuery.Class = function(){};

    // Create a new Class that inherits from this class
    jQuery.Class.create = function(prop) {
        var _super = this.prototype;

        // Instantiate a base class (but only create the instance,
        // don't run the init constructor)
        initializing = true;
        var prototype = new this();
        initializing = false;
        // Copy the properties over onto the new prototype
        for (var name in prop) {
            // Check if we're overwriting an existing function
            prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name])
            ? (function(name, fn){
                    return function() {
                        var tmp = this._super;

                        // Add a new ._super() method that is the same method
                        // but on the super-class
                        this._super = _super[name];

                        // The method only need to be bound temporarily, so we
                        // remove it when we're done executing
                        var ret = fn.apply(this, arguments);     
                        this._super = tmp;

                        return ret;
                    };
                })(name, prop[name])
            : prop[name];
        }

        // The dummy class constructor
        function Class() {
            // All construction is actually done in the init method
            if ( !initializing && Class.prototype.init )
                return Class.prototype.init.apply(this, arguments);
        }

        // Populate our constructed prototype object
        Class.prototype = prototype;

        // Enforce the constructor to be what we expect
        Class.prototype.constructor = Class;

        // And make this class extendable
        
        Class.extend = arguments.callee;

        return Class;
    };
    
})(jQuery);


но если наследовать с помощью этого дела дочерние классы, почему-то у них у всех, свойства которые являются объектом (массив, []) общие.. никак не могу понять в чем дело и как это пофиксить.

например:

var a = $.Class.create({});
    var b = a.extend({
        object: []
    });
    var c = b.extend({});
    var d = b.extend({});
    
    var x = new c();
    var y = new d();
    x.object.push(1,2,3);
    alert(y.object); // в результате получаем "1,2,3" хотя этот объект не трогали вообще.


собственно когда мы создали c & d то у них по сути должны быть разные свойства object, т.к. они скопированы из объекта b. Но почемуто у всех у них одинаковое свойство...

Я сначала думал что они все(c,d) получают не копию объекта, а ссылку от b. Пробовал при копировании свойств из родительского класса (при екстенде) перевести в JSON и обратно (мало ли :), но ничего не вышло, как было так и осталось.

Помогите разобраться пожалуйста.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования