Após os comentários de #1633 e #1634 e os problemas referenciados, acho que seria uma boa ideia criar uma opção de tempo de execução que permita colocar na lista de permissões o protótipo de uma determinada classe.
Chamando o modelo de sagacidade
template ({some: "input object"}, { allowedPrototypes: [
Test
] })
permitiria que uma propriedade fosse resolvida se o seguinte for verdadeiro.
parent[propertyName] === Test.prototype[propertyName] && Test.prototype.hasOwnProperty(propertyName)
Eu acho que seria útil ao usar classes personalizadas em servidores web, porque certamente não é seguro desativar as verificações de protótipo em tal ambiente.
Gostaria de ter opiniões sobre isso.
Um problema em potencial é que os usuários esperam que adicionar B
aos protótipos permitidos funcione neste 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
Isso não é tão ruim, só precisa ser documentado, mas provavelmente surpreenderia algumas pessoas.
Também podemos verificar se as superclasses estão na lista de permissões, então você só precisa colocar "A" na lista de permissões para que as propriedades de "A" e "B" sejam aceitas.
O contrário é mais difícil, pois exigia a inclusão de todas as classes nativas na lista negra, o que pode mudar com o tempo.
@nknapp Seria possível usar getPrototypeOf
e getOwnPropertyDescriptor
para ver se o getter foi definido. Não tenho certeza se isso regride aos problemas que já foram corrigidos ou não.
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 }
Comentários muito úteis
Um problema em potencial é que os usuários esperam que adicionar
B
aos protótipos permitidos funcione neste caso:Isso não é tão ruim, só precisa ser documentado, mas provavelmente surpreenderia algumas pessoas.