tutorial injection attack javascript inheritance prototype-programming object-create

tutorial - javascript injection attack



¿Cómo funciona object.create en JavaScript? (1)

Un prototipo es un objeto normal. Cuando un objeto hereda un prototipo, no solo copia las propiedades del prototipo, el objeto almacena una referencia al prototipo.

Tienes razón, el prototipo de un objeto, es solo otro objeto al que se hace referencia a través de la cadena de prototipos.

La diferencia entre tus dos fragmentos es que con __proto__ estás mutando el prototipo de food . En su segundo ejemplo, simplemente está asignando un nuevo objeto que se hereda de more_food , por eso food.fruit se resuelve en undefined , porque su asignación original ha perdido su objeto de food original.

¿Qué está haciendo exactamente Object.create?

Object.create crea un nuevo objeto que hereda del objeto pasado como su primer argumento (solo puede ser un objeto o un null ).

¿Se asigna a la variable food la referencia al prototipo more_food, o es Object.create simplemente devolviendo una copia del objeto more_food?

Su variable de food tendrá un nuevo objeto, que se hereda de more_food , no hay ninguna copia en esta operación.

Por ejemplo:

var food = {fruit:"apple"}; var more_food = Object.create(food, { vegetable: { value: "celery" } }); more_food.fruit; // "apple" more_food.vegetable; // "celery"

En el ejemplo anterior, more_food hereda de los food , en otras palabras, food es el prototipo de more_food , esta referencia prototípica se almacena en una propiedad interna llamada [[Prototype]] . El segundo argumento de Object.create permite inicializar propiedades en este nuevo objeto.

No hay copia, es simplemente la delegación en el ejemplo anterior. more_food.fruit puede more_food.fruit través de la cadena de prototipos. El proceso de búsqueda de propiedades es realmente simple. Si una propiedad no se encuentra en un objeto, se busca de nuevo (¡delegación!) En el el prototipo del objeto, recursivamente, hasta que se encuentra un objeto cuyo prototipo es null (como Object.prototype ).

Entonces, more_food.fruit es una propiedad heredada:

more_food.hasOwnProperty(''fruit''); // false, inherited ''fruit'' in more_food; // true

Mientras que el vegetable es una propiedad propia de more_food :

more_food.hasOwnProperty(''vegetable''); // true

El ejemplo anterior se ve gráficamente así:

+---------------------+ [[Prototype]] +---------------+ | more_food |+--------------->| food | |---------------------| |---------------| | vegetable: "celery" | | fruit: "apple | +---------------------+ +---------------+

Si Object.create solo está haciendo una copia, ¿cómo funciona la cadena del prototipo si la variable food no tiene ninguna referencia a more_food?

Object.create no crea copias de objetos, solo configura el prototipo de un nuevo objeto en el momento de su creación.

Tenga en cuenta que __proto__ es una función estándar y que se eliminará de las implementaciones en el futuro, ya se ha incluido como obsoleto en la Documentación de Mozilla , la razón principal de esto, y también es la razón por la que el idioma nunca tenga una La forma de mutar la cadena del prototipo de la forma en que __proto__ permite es que causa problemas de optimización y seguridad, a nivel de VM y JIT.

Dime si estoy equivocado:

Un prototipo es un objeto normal. Cuando un objeto hereda un prototipo, no solo copia las propiedades del prototipo, el objeto almacena una referencia al prototipo.

En Firefox, puedo hacer:

var food = {fruit:"apple"}; var more_food = {vegetable:"celery"}; food.__proto__ = more_food; food.vegetable // celery food.fruit // apple

Puedo usar la propiedad __proto__ para establecer manualmente la referencia al objeto prototipo.

También puedo usar Object.create :

var food = {fruit:"apple"}; var more_food = {vegetable:"celery"}; food = Object.create(more_food); food.vegetable // celery food.fruit // undefined

¿Qué está haciendo exactamente Object.create ? ¿Se asigna a la variable food la referencia al prototipo more_food, o es Object.create simplemente devolviendo una copia del objeto more_food? Si Object.create solo está haciendo una copia, ¿cómo funciona la cadena del prototipo si la variable food no tiene ninguna referencia a more_food?