2010-02-19 8 views
6

Soy nuevo en la herencia de prototipos, así que estoy tratando de entender el camino "correcto". Pensé que podría hacer esto:Herencia de Prototypal: ¿Puedes encadenar Object.create?

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function F() {} 
     F.prototype = o; 
     return new F(); 
    }; 
} 

var tbase = {}; 

tbase.Tdata = function Tdata() {}; 

tbase.Tdata.prototype.say = function (data) { 
    console.log(data); 
}; 

var tData = new tbase.Tdata(); 

tbase.BicData = Object.create(tData); 

tbase.BicData.prototype.say = function (data) { 
    console.log("overridden: " + data) 
}; 

tbase.BicData.prototype.shout = function (data, temp) { 
    console.log("SHOUT: " + data + ", " + temp) 
}; 

var test = new tbase.BicData(); 

tData.say("test1"); 
test.say("test2"); 
test.shout("test3", "hope"); 

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
     function F() {} 
     F.prototype = o; 
     return new F(); 
    }; 
} 

var tbase = {}; 

tbase.Tdata = function Tdata() {}; 

tbase.Tdata.prototype.say = function (data) { 
    console.log(data); 
}; 

var tData = new tbase.Tdata(); 

tbase.BicData = Object.create(tData); 

tbase.BicData.prototype.say = function (data) { 
    console.log("overridden: " + data) 
}; 

tbase.BicData.prototype.shout = function (data, temp) { 
    console.log("SHOUT: " + data + ", " + temp) 
}; 

var test = new tbase.BicData(); 

tData.say("test1"); 
test.say("test2"); 
test.shout("test3", "hope"); 

Pero en cambio me sale "tbase.BicData.prototype no está definido"

En Java hablan, lo que quiero es tener Tdatos como repetitivo ' interfaz ', BicData para ser una implementación de eso, y luego instanciar los objetos a partir de él.

¿Dónde me estoy equivocando?

Respuesta

8

El problema es que tbase.BicData es un objeto (tbase.BicData = Object.create(tData);) y la propiedad prototype se debe usar en las funciones de constructor.

Tomando ventaja del método Object.create, me gustaría hacer algo como esto:

var tbase = {}; 

tbase.Tdata = { 
    say : function (data) { 
    console.log(data); 
    } 
}; 

tbase.BicData = Object.create(tbase.Tdata); 

tbase.BicData.say = function (data) { 
    console.log("overridden: " + data) 
}; 

tbase.BicData.shout = function (data, temp) { 
    console.log("SHOUT: " + data + ", " + temp) 
}; 

var test = Object.create(tbase.BicData); 
var tData = Object.create(tbase.Tdata); 

tData.say("test1"); // test1 
test.say("test2"); // overridden: test2 
test.shout("test3", "hope"); // SHOUT: test3, hope 
+3

+1 He borrado mi respuesta, usted tiene razón :) – mck89

+0

Esto se ve bien! Gracias :) – robinhowlett

+1

Creo que la mayor parte de la confusión del OP se evitaría si el OP no hubiera mezclado 'new' y' Object.create'. Digo elegir uno y mantenerlo. –

Cuestiones relacionadas