Handlebars.js: Control de acceso a las propiedades de los prototipos

Creado en 11 ene. 2020  ·  3Comentarios  ·  Fuente: handlebars-lang/handlebars.js

Después de los comentarios de # 1633 y # 1634 y los problemas mencionados, creo que sería una buena idea crear una opción de tiempo de ejecución que permita incluir en la lista blanca el prototipo de una clase determinada.

Llamando ingenio a la plantilla

template ({some: "input object"}, { allowedPrototypes: [
  Test
] })

permitiría resolver una propiedad si se cumple lo siguiente.

parent[propertyName] === Test.prototype[propertyName] && Test.prototype.hasOwnProperty(propertyName)

Creo que sería útil al usar clases personalizadas en servidores web, porque ciertamente no es seguro desactivar las comprobaciones de prototipos en dicho entorno.

Me gustaría tener opiniones al respecto.

feature

Comentario más útil

Un problema potencial es que los usuarios esperarán que agregar B a los prototipos permitidos funcione en este caso:

class A { get a() { return 'a' } }
class B extends A {}

const parent = new B();
parent['a'] === B.prototype['a'] && B.prototype.hasOwnProperty('a') // => false

Esto no es tan malo, solo necesita ser documentado, pero probablemente sorprendería a algunas personas.

Todos 3 comentarios

Un problema potencial es que los usuarios esperarán que agregar B a los prototipos permitidos funcione en este caso:

class A { get a() { return 'a' } }
class B extends A {}

const parent = new B();
parent['a'] === B.prototype['a'] && B.prototype.hasOwnProperty('a') // => false

Esto no es tan malo, solo necesita ser documentado, pero probablemente sorprendería a algunas personas.

También podríamos verificar si las superclases están en la lista blanca, por lo que solo necesita incluir "A" en la lista blanca para que se acepten las propiedades de "A" y "B".

Al revés es más difícil, porque requería incluir en la lista negra todas las clases nativas, lo que puede cambiar con el tiempo.

@nknapp ¿Sería posible usar getPrototypeOf y getOwnPropertyDescriptor para ver si se definió el getter? No estoy seguro de si esto vuelve a los problemas que ya se solucionaron o no.

class Example {
  get hello() {
    return 'world';
  }
}

const obj = new Example();
console.log(obj.hello);
// "world"
console.log(Object.getOwnPropertyDescriptor(obj, 'hello'));
// undefined
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), 'hello'));
// { configurable: true, enumerable: false, get: function get hello() { return 'world'; }, set: undefined }

fuente: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get#get_Vs._defineProperty

¿Fue útil esta página
0 / 5 - 0 calificaciones