2011-01-24 10 views
29

Przyjmijmy, mam klasy tak:JavaScript dziedzictwo i sposób nadrzędny

function Widget() { 
    this.id = new Date().getTime(); 
    // other fields 
} 
Widget.prototype = { 
    load: function(args) { 
     // do something 
    } 
} 

Od tej klasie I stworzył kilka innych klas, które dziedziczą ten sam prototyp, ale mają pewne dodanych metod. To, co chcę zrobić, to móc zdefiniować metodę load() w podklasach, która najpierw wywołuje metodę macierzystą, a następnie wykonuje pewien kod. Coś jak:

SpecialWidget.prototype = { 
    load: function(args) { 
     super.load(args); 
     // specific code here 
    } 
} 

Wiem, że nie ma super słowa kluczowego w JavaScript, ale musi być sposób, aby to zrobić.

Odpowiedz

40

Można symulować to tak:

SpecialWidget.prototype = { 
    load: function(args) { 
     Widget.prototype.load.call(this, args); 
     // specific code here 
    } 
} 

Można też tworzyć własne super-własność takiego:

SpecialWidget.prototype.parent = Widget.prototype; 

SpecialWidget.prototype = { 
    load: function(args) { 
     this.parent.load.call(this,args); 
     // specific code here 
    } 
} 
+1

To chyba najprostsze rozwiązanie! Dziękuję –

+0

To daje mi nieskończoną pętlę w moim kodzie i nie jestem pewien dlaczego .. – CarbonDry

+0

Po prostu, aby dodać do mojego poprzedniego komentarza, mam obiekt, który jest już dziedziczony z klasy i chcę specjalizować się z metody w zasadzie. – CarbonDry

1

ja nie wiem, czy jest to najlepsze rozwiązanie, ale mógłby zrobić coś takiego:

function Widget() { 
    this.id = new Date().getTime(); 
} 
Widget.prototype.load = function(args) { 
    alert('parent load'); 
}; 

SpecialWidget = function(){}; 

    // Make the prototype of SpecialWidget an instance of Widget 
var proto = SpecialWidget.prototype = new Widget; 

    // Give the prototype a function that references the "load" from Widget 
proto.parent_load = proto.load; 

    // Give SpecialWidget its own "load" that first calls the parent_load 
proto.load = function(args) { 
    this.parent_load(args); 
    alert('special load'); 
}; 

var inst = new SpecialWidget; 

inst.load(); 

to sprawia, że ​​prototyp SpecialWidget instancją Widget, tak aby dziedziczył wszystko, co ma Widget.

to ma odniesienie do load() z Widget zwanego parent_load() i tworzy swój własny load() że wywołuje parent_load() przy wywołaniu.

+0

Możesz użyć 'Object.create (Thing.prototype)' zamiast 'New Thing' jeśli nie obsługujesz starych klientów. – LeeGee

2

więc najpierw skonfigurować „podklasy” jak tak

function SubClass(name) { 
    Super.call(this); 

    // stuff here 
} 

SubClass.prototype = new SuperClass(null); 
SubClass.prototype.constructor = SubClass; 

a następnie można zrobić

SuperClass.prototype.theMethod.apply(this); 

od wewnątrz implementacji podklasy specjalnie wywołać realizację super jest.

+0

Dla tych, jak ja, które zakwestionowały różnicę między tym podejściem a wezwaniem w odpowiedzi, krótka odpowiedź brzmi, że nie ma. Długa odpowiedź jest dostarczana przez Mozilla tutaj ... https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply – Jackie

0

Byłoby to możliwe do przechowywania starą wartość metody load w zamknięciu, jeśli nie twój nadrzędny tak:

function Widget() { 
    this.id = new Date().getTime(); 
    // other fields 
} 

Widget.prototype = { 
    load: function(args) { 
     // do something 
     alert("Widget Prototype Load"); 
    } 
}; 

function SpecialWidget(){ 
}; 

SpecialWidget.prototype = new Widget(); 

(function(){ 
    var oldLoad = SpecialWidget.prototype.load; 
    SpecialWidget.prototype.load = function(){ 
     oldLoad(); 
     alert("new Load"); 
    }; 
}()); 


var x = new SpecialWidget(); 
x.load(); 

To działa, ale nie jestem pewien, czy to jest najlepsza metoda .

Powiązane problemy