2013-11-14 2 views
0

я класс, определенный как:Javascript расширяет класс с помощью реквизитов?

function MyClass() { 

} 

MyClass.prototype = { 
     init: function() { 
       alert('My parent class!'); 
     }, 
     method1: function() {}, 
     method2: function() {} 
}; 

и свойства объекта:

{ 
    init: function() { 
       MySubClass.superclass.init.apply(this, arguments); 
       alert('test!'); 
    }, 

    test: function() { 
       alert(); 
    } 
} 

и я нужна функция, которая будет расширяет базовый класс (MyClass) с опорами (объекта) и вернуть новый расширенный подкласс (к MySubClass):

MySubclass = extend(MyClass, { 
    init: function() { 
       MySubClass.superclass.init.apply(this, arguments); 
       alert('test!'); 
    }, 

    test: function() { 
       alert(); 
    } 
}); 

Конструктор должен быть заменен новым конструктором (из init).

Мне нужен правильный путь.

Почему это не работает?

extend: function(bc, o) { 
     // result class (apply only first constructor) 
     var cls = function() {}; 
     cls.prototype = bc.prototype; 

     for (var k in o) 
      cls.prototype[k] = o[k]; 

     cls.superclass = bc.prototype; 

     return cls; 
    } 

ответ

0

Если вы открыты для пользования библиотекой, используйте _.extend из underscore.js. В противном случае, добавьте этот код в ваш кодовую:

extend = function(obj) { 
    each(slice.call(arguments, 1), function(source) { 
     if (source) { 
     for (var prop in source) { 
      obj[prop] = source[prop]; 
     } 
     } 
    }); 
    return obj; 
    }; 
+0

это объектно-ориентированное программирование, а MyClass - не объект. MyClass - это функция, которую я хочу расширить с помощью объекта. – xercool

+0

@xercool 'MyClass' - фактически объект, хотя это объект' Function'. Просто FYI –

0

Я вижу, вы с тегами JQuery - если вы действительно используете JQuery, вы можете быть заинтересованы в использовании $.extend.

+0

Почему это было приостановлено? –

+0

Zougen не заслуживает того, что он очень полезен. – Max

+0

Спасибо @ Макс, я рад, что это здорово! $ .extend - мой самый популярный plug-in-jquerie, который я использую по этой причине. –

2

Ваша extend функции придется искать что-то вроде этого - теперь это гораздо проще, чем, как вы действительно должны реализовать его, но он должен работать:

var extend = function(Super, props) { 
    var sinstance = new Super() 
    var sclass = props.constructor || sinstance.constructor; 
    sclass.prototype.super = sinstance; 
    sclass.prototype.constructor = Super; 

    //use underscore extend prototypes cause im too lazy to type it out 
    _.extend(sclass.prototype, sinstance, props); 
    return sclass; 
} 

Вызов subclass.super.call(this, props...) позволяет получать доступ переопределена супер метода.

Просто протестирована и это работает, если подчеркивание JS на странице:

function MyClass() { 

} 
MyClass.prototype = { 
     init: function() { 
       alert('My parent class!'); 
     }, 
     method1: function() {}, 
     method2: function() {} 
}; 

MySubclass = extend(MyClass, { 
    init: function() { 
       this.super.init.apply(this, arguments); 
       alert('test!'); 
    }, 

    test: function() { 
       alert(); 
    } 
}); 

var test = new MySubclass(); 
test.init("yo"); //alerts My parent class 

Для обновления вашего вы также можете сделать это:

MySubclass2 = extend(MyClass, { 
    constructor: function() { 
     this.init(); 
    }, 

    init: function() { 
       this.super.init.apply(this, arguments); 
       alert('test!'); 
    }, 

    test: function() { 
       alert(); 
    } 
}); 

var test2 = new MySubclass2();//alerts My parent class 
+0

Я думаю, что $ .extend также может работать, но я не помню синтаксис метода – megawac

+0

'new Super()' будет вызывать конструктор базового класса, но мне нужно заменить конструктор классов методом класса. – xercool

+0

Хорошо из ваших примеров, я предположил, что вы хотите использовать конструктор 'super'. Вам нужно передать функцию расширения функции, подобной той версии, которую я только что обновил, отвечая – megawac

0

Взгляните на это: https://github.com/haroldiedema/joii

var BaseClass = function() 
{ 
    this.some_var = "foobar"; 

    /** 
    * @return string 
    */ 
    this.someMethod = function() { 
     return this.some_var; 
    } 
}; 

var MyClass = new Class({ extends: BaseClass }, function() 
{ 
    /** 
    * @param string value 
    */ 
    this.__construct = function(value) 
    { 
     this.some_var = value; 
    } 

}) 

Использование:

var obj = new MyClass("Hello World!"); 
console.log(obj.someMethod()); // Hello World! 
Смежные вопросы