Quindi quali sono i motivi per scegliere l'ereditarietà di stile OOP classica rispetto all'ereditarietà del prototipo? In realtà, credo che alcuni quadri siano "una specie di" combinazione di approcci. Prendiamo ad esempio il modello di ereditarietà della combinazione parassita. Questo è ciò che sta facendo YAHOO.lang.extend.
Utilizza l'ereditarietà prototipale e una funzione di supporto per ereditare i prototipi e il furto del costruttore. Wow, che suona complesso ... beh sì, è - ecco la mia implementazione e di test, ad esempio:
// Prototypal Inheritance
Object.prototype.inherit = function(p) {
NewObj = function(){};
NewObj.prototype = p;
return new NewObj();
};
// Paraphrasing of Nicholas Zakas's Prototype Inheritance helper
function inheritPrototype(subType, superType) {
var prototype = Object.inherit(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
};
function SubType(name, age) {
Parent.call(this, name);
this.age = age;
};
inheritPrototype(SubType, Parent);
SubType.prototype.getAge = function() {
return this.age;
};
Ho un banco di prova per questo codice:
describe 'Parisitic Combination Inheritance'
it 'should use inheritPrototype (to call parent constructor once) and still work as expected'
sub = new SubType("Nicholas Zakas", 29)
sub.toString().should.match /.*Nicholas Zakas/
sub.getAge().should.eql 29
charlie = new SubType("Charlie Brown", 69)
charlie.arr.should.eql([1,2,3])
charlie.arr.push(999)
charlie.arr.should.eql([1,2,3,999])
sub.arr.should.eql([1,2,3])
sub.should.be_an_instance_of SubType
charlie.should.be_an_instance_of SubType
(sub instanceof SubType).should.eql true
(sub instanceof Parent).should.eql true
end
end
E, naturalmente, se si' prestando attenzione ai miei letterali si vede: Nicholas Zakas, il ragazzo da cui ho preso questo;) Le grandi vittorie per questo: instanceof funziona (un grosso affare alcuni dicono e io sono d'accordo); le istanze non condividono lo stato sui tipi di riferimento come gli array (un biggie!); il costruttore genitore ha chiamato solo una volta (un grosso problema!).
BTW, non ho esempi della maggior parte dei modelli di eredità popolari qui: My TDD JS Examples
Il dibattito non finisce qui? Riassumo un documento interessante. In poche parole, la visione del mondo basata sulla classe è più difettosa di quella dei prototipi.Quindi, dobbiamo stare attenti. Ecco il riassunto: http://carnotaurus.tumblr.com/post/3248631891/class-based-javascript-or-not – CarneyCode
Hai scoperto la vera domanda che stavo chiedendo :) Ho appena visto il tuo impegno oggi. Grazie per averlo indicato. –