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' prototype
pero ¿qué pasa si tiene una propiedad en suSomeBaseClass
gusto?y si lo usas como
El
obj
objeto no tendrápublicProperty
propiedades como en este ejemplo .Tu segundo ejemplo
Está ejecutando la
constructor
función, haciendo una instanciaSomeBaseClass
y heredando todo elSomeBaseClass
objeto. Entonces, si usasEn este caso, su
publicProperty
propiedad también está disponible para elobj
objeto como en este ejemplo .Dado
Object.create
que no está disponible en algunos navegadores antiguos, en ese caso puede usarEl código anterior solo agrega
Object.create
función si no está disponible para que pueda usar laObject.create
función y creo que el código anterior describe lo queObject.create
realmente hace. Espero que ayude de alguna manera.fuente
SomeBaseClass
.Eso es cierto en tu caso.
Cuando
SomeBaseClass
tiene un cuerpo de función, esto se ejecuta con lanew
palabra 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 lasMyClass
instancias 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 elnew
enfoque 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 laprototype
palabra 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.create
realmente no puede reemplazar el enfoque clásico connew
cuando se necesita una función de constructorObject.create
no llama a una función que sería necesaria para crear cierres. Por supuesto, conObject.create
usted puede poner uninit
método en sus objetos y llamarlo de inmediato, y tal vez incluso regresethis
para que obtenga una sintaxis concisa, pero espere, entonces ese es un constructor.new
usos "enlace de objeto", por lo que no hay mucha diferencia. De hecho, solo hay dos cosas:.constructor
se llama.init
, y esa función no tiene una.prototype
propiedad que apunte hacia su objeto prototipo. El resto es solo sintaxis, y prefieronew X
sobreObject.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