En JavaScript, ¿cuál es la diferencia entre estos dos ejemplos?
Requisito previo:
function SomeBaseClass(){
}
SomeBaseClass.prototype = {
doThis : function(){
},
doThat : function(){
}
}
Ejemplo de herencia A usando Object.create:
function MyClass(){
}
MyClass.prototype = Object.create(SomeBaseClass.prototype);
Ejemplo de herencia B usando la nueva palabra clave
function MyClass(){
}
MyClass.prototype = new SomeBaseClass();
Ambos ejemplos parecen hacer lo mismo. ¿Cuándo elegirías uno sobre el otro?
Una pregunta adicional: considere el código en el siguiente enlace (línea 15), donde se almacena una referencia al propio constructor de la función en el prototipo. ¿Por qué es útil esto?
https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js
Extracto (si no desea abrir el enlace):
THREE.ImageLoader.prototype = {
constructor: THREE.ImageLoader
}
javascript
inheritance
object-create
ChrisRich
fuente
fuente

Object.create. Esto es un error y debe reabrirse.Respuestas:
En su pregunta ha mencionado que
Both examples seem to do the same thing, no es cierto en absoluto, porqueTu primer ejemplo
En este ejemplo, solo está heredando,
SomeBaseClass' prototypepero ¿qué pasa si tiene una propiedad en suSomeBaseClassgusto?y si lo usas como
El
objobjeto no tendrápublicPropertypropiedades como en este ejemplo .Tu segundo ejemplo
Está ejecutando la
constructorfunción, haciendo una instanciaSomeBaseClassy heredando todo elSomeBaseClassobjeto. Entonces, si usasEn este caso, su
publicPropertypropiedad también está disponible para elobjobjeto como en este ejemplo .Dado
Object.createque no está disponible en algunos navegadores antiguos, en ese caso puede usarEl código anterior solo agrega
Object.createfunción si no está disponible para que pueda usar laObject.createfunción y creo que el código anterior describe lo queObject.createrealmente hace. Espero que ayude de alguna manera.fuente
SomeBaseClass.Eso es cierto en tu caso.
Cuando
SomeBaseClasstiene un cuerpo de función, esto se ejecuta con lanewpalabra clave. Esto generalmente no es intencionado: solo desea configurar la cadena de prototipos. En algunos casos, incluso podría causar problemas graves porque realmente crea una instancia de un objeto, cuyas variables de ámbito privado son compartidas por todas lasMyClassinstancias ya que heredan los mismos métodos privilegiados. Otros efectos secundarios son imaginables.Por lo tanto, generalmente debería preferir
Object.create. Sin embargo, no es compatible con algunos navegadores heredados; esa es la razón por la que ve elnewenfoque demasiado frecuente, ya que a menudo no hace daño (obvio). También eche un vistazo a esta respuesta .fuente
La diferencia se vuelve obvia si se usa
Object.create()como se pretende. En realidad, oculta completamente laprototypepalabra de su código, hará el trabajo bajo el capó. UsandoObject.create(), podemos ir comoY luego podemos extender / heredar otros objetos de este
Así que este es otro concepto, una forma de inserción más "orientada a objetos". No hay una "función de constructor" fuera de la caja usando,
Object.create()por ejemplo. Pero, por supuesto, podría crear y llamar a una función constructora autodefinida dentro de esos objetos.Un argumento para el uso
Object.create()es que puede tener un aspecto más natural, a mezclar / * * heredan de otros objetos, que el uso de Javascripts manera predeterminada .fuente
Object.createrealmente no puede reemplazar el enfoque clásico connewcuando se necesita una función de constructorObject.createno llama a una función que sería necesaria para crear cierres. Por supuesto, conObject.createusted puede poner uninitmétodo en sus objetos y llamarlo de inmediato, y tal vez incluso regresethispara que obtenga una sintaxis concisa, pero espere, entonces ese es un constructor.newusos "enlace de objeto", por lo que no hay mucha diferencia. De hecho, solo hay dos cosas:.constructorse llama.init, y esa función no tiene una.prototypepropiedad que apunte hacia su objeto prototipo. El resto es solo sintaxis, y prefieronew XsobreObject.create(x).init().No soy un experto en Java Script, pero aquí hay un ejemplo simple para entender la diferencia entre "Object.create" y "new".
Paso 1: crea la función padre con algunas propiedades y acciones.
Paso 2: cree una función secundaria (PersonSalary) que se extienda por encima de la función Persona usando la nueva palabra clave.
paso 3: crea la segunda función secundaria (PersonLeaves) que se extiende por encima de la función Person usando la palabra clave Object.create ..
// Ahora verifique ambos prototipos de funciones secundarias.
ambas funciones secundarias se vincularán al prototipo Persona (función principal) y pueden acceder a sus métodos, pero si crea una función secundaria usando new, devolverá un objeto completamente nuevo con todas las propiedades principales que no necesitamos y también cuando cree cualquier objeto o función usando "Nuevo" que se ejecuta la función padre que no queremos ser.
Aquí están los platos para llevar
fuente