2014-02-13 2 views
0

Я хочу, чтобы пользователь мог создавать классы из базового класса и других классов, созданных пользователем, через одну функцию, заданную литералом объекта.Наследование javascript с родительской переменной

так что бы список классов:

var allclasses = {}; 

родительский класс может выглядеть примерно так, все классы имеют этот предок: база = функция() { «базовый» this.name = ; this.varname = 250; } base.prototype = { foo: function() { this.varname + = 50; } } // добавлен ко всем классам allclasses ['base'] = base;

и метод создания новых классов:

function create(childliteral) { ???? } 

пример того, как это будет работать, в идеале:

var myclass = create({ 
    parentname: 'base', // a required variable, create will return false if this isn't valid (not in allclasses) 
    name: 'specialname', // a required variable, create will return false if this is already in allclasses 
    foo: function() { 
    this.varname += 100; 
    // this is the part is what causes the most stress, I want it to call the parents function 'foo' 
    this.parent.foo(); 
    return this.varname; 
    } 
}); 

, а затем создать экземпляр класса:

var myobject = new myclass(); 

или ..

var myobject2 = new allclasses['specialname']; 

и, наконец, вызывая

myobject.foo(); 
console.log(myobject.varname) // prints out 400 

myobject.parent.foo(); 
console.log(myobject.varname) // prints out 450 
console.log(myobject.parent.varname) // also prints out 450 
console.log(myobject.parent.name) // prints out 'base' 
console.log(myobject.parentname) // prints out 'base' 
console.log(myobject.name) // prints out 'specialname' 

Я получил очень близко к этому, за исключением того, что я не мог цепи более двух объектов.

+0

Покажите нам ваш текущий код, пожалуйста! Обратите внимание, что 'this.parent. ...' потеряет контекст текущего экземпляра, поэтому вам может понадобиться переосмыслить этот шаблон. Также посмотрите на ['Class.js'] (http://stackoverflow.com/a/15052240/1048572), чтобы получить вдохновение :-) – Bergi

+0

Кроме того, вы можете взглянуть на T.J. Crowder's ** [Lineage] (https://code.google.com/p/lineagejs/) **. Но будьте осторожны в использовании слова «класс» здесь; он часто приносит с собой ожидания от других языков, которые нелегко удовлетворяются с помощью наследования на основе прототипов Javascript, а также ограничений от тех, кто не существует в JS. Кроме того, многие люди JS обходятся по этому поводу. :-) –

+0

Вам нужно лучше объяснить параметры, которые вы хотите передать в метод создания – ppoliani

ответ

0

Вам нужно как-то сохранить ссылку на суперкласс; например

var myclass = create({ 
    parentName: 'Base', 
    name: 'specialname', 
    childCtor: function() { }, 
    childProto: { 
     foo: function(){ 
     this.varname += 100; 
     this._base_.foo(); // reference to the superclass 
     return this.varname; 
     } 
    } 
}); 

Посмотрите на полный пример http://jsfiddle.net/zzu8J/7/

Смежные вопросы