Ho giocato con Object.create nelle specifiche di EcmaScript 5 e sto cercando di creare una struttura di tipo a ereditarietà multipla.Object.create vs eredità prototipale diretta
Dire che ho un paio di funzioni: a, b, c. Con solo trattare con i prototipi, posso fare questo:
function a() {}
a.prototype = {
fnA = function() {},
propA = 500
};
function b() {}
b.prototype = a.prototype;
b.prototype.fnB = function() {};
b.prototype.propB = 300;
function c() {}
c.prototype = b.prototype;
c.prototype.fnC = function() {};
c.prototype.propC = 200;
Ma usando Object.create, vorrei fare qualcosa di questo:
function a() {}
a.prototype = {
fnA = function() {},
propA = 500
};
var b = Object.create(new a());
b.fnB = function() {};
b.propB = 300;
var c = Object.create(b);
c.fnC = function() {};
c.propC = 200;
Credo di ottenere lo stesso risultato in entrambi i modi.
Questo sembra un po 'goffo, perché ottengo l'oggetto indietro invece di una funzione di costruzione. Mi sembra che fare la normale eredità prototipica sia meno intrusivo e abbia più senso per le applicazioni modulari che non hanno bisogno di trattamenti speciali per funzionare.
Mi sto perdendo qualcosa? C'è qualche vantaggio nel provare a creare Object.create con i costruttori? O è utile solo per copiare oggetti esistenti? Desidero solo accedere alle proprietà & funzioni associate al prototipo e non alle funzioni e alle proprietà aggiunte in seguito all'oggetto.
O che ne è di questo (o utilizzare una copia in profondità migliore, ma l'idea rimane la stessa)?
function A() {}
A.prototype = {
fn: function() {
console.log(this.propA + 30);
},
propA: 20
};
function B() {}
Object.keys(A.prototype).forEach(function (item) {
B.prototype[item] = A.prototype[item];
});
B.prototype.propA = 40;
function C() {}
Object.keys(B.prototype).forEach(function (item) {
C.prototype[item] = B.prototype[item];
});
C.prototype.fn = function() {
console.log(this.propA + 3);
};
var a = new A(),
b = new B(),
c = new C();
a.fn();
b.fn();
c.fn();
destro, credo di sì. Ma cosa succede se ho copiato tutte le proprietà nel prototipo di a to b, poi ho aggiunto cose al prototipo, poi ho fatto lo stesso per c? Questo raggiungerebbe la stessa cosa? – tjameson
Meglio usare 'Object.create'. Quindi, 'b.prototype = Object.create (a.prototype);' E quindi stiamo usando la soluzione migliore per rendere migliore la soluzione minore. – jmbucknall
Posso fare un altro costruttore? Dite che faccio Object.create, posso fare 'function new() {} new.prototype = Object.create (b);' o qualcosa di simile? Voglio solo una funzione esportabile ... – tjameson