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.
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 }
Comentario más útil
Un problema potencial es que los usuarios esperarán que agregar
B
a los prototipos permitidos funcione en este caso:Esto no es tan malo, solo necesita ser documentado, pero probablemente sorprendería a algunas personas.